0

有什么可以想象的原因为什么我会看到使用 unicode 字符串文字与 UChar 的实际十六进制值不同的结果。

UnicodeString s1(0x0040); // @ sign
UnicodeString s2("\u0040");

s1 不等于 s2。为什么?

4

4 回答 4

1

\u 转义序列 AFAIK 是实现定义的,因此在不了解特定编译器的详细信息的情况下,很难说它们为什么不等价。也就是说,这根本不是一种安全的做事方式。

UnicodeString 有一个使用 UChar 和一个用于 UChar32 的构造函数。使用它们时我会很明确:

UnicodeString s(static_cast<UChar>(0x0040));

UnicodeString 还提供了一个相当方便的unescape()方法:

UnicodeString s = UNICODE_STRING_SIMPLE("\\u4ECA\\u65E5\\u306F").unescape(); // 今日は
于 2012-06-20T03:41:21.210 回答
0

无法在 ICU 4.8.1.1 上重现

#include <stdio.h>
#include "unicode/unistr.h"

int main(int argc, const char *argv[]) {
  UnicodeString s1(0x0040); // @ sign
  UnicodeString s2("\u0040");
  printf("s1==s2: %s\n", (s1==s2)?"T":"F");
  //  printf("s1.equals s2: %d\n", s1.equals(s2));
  printf("s1.length: %d  s2.length: %d\n", s1.length(), s2.length());
  printf("s1.charAt(0)=U+%04X s2.charAt(0)=U+%04X\n", s1.charAt(0), s2.charAt(0));
  return 0;
}

=>

s1==s2:T

s1.长度:1 s2.长度:1

s1.charAt(0)=U+0040 s2.charAt(0)=U+0040

gcc 4.4.5 RHEL 6.1 x86_64

于 2011-11-16T06:36:42.940 回答
0

对于其他找到这个的人,这就是我发现的(在 ICU 的文档中)。

编译器和运行时字符集的代码页编码未由 C/C++ 语言标准指定,并且通常不是 Unicode 编码形式。它们通常取决于各个系统、进程或线程的设置。因此,不可能直接使用 C/C++ 字符或字符串文字实例化 Unicode 字符或字符串变量。唯一安全的方法是使用数值。对于已翻译的用户界面 (UI) 字符串,这不是问题。

[1] http://userguide.icu-project.org/strings

于 2011-11-16T18:25:39.193 回答
-1

\u常量中的双引号是问题所在。这正确评估:

wchar_t m1( 0x0040 );
wchar_t m2( '\u0040' );
bool equal = ( m1 == m2 );

equaltrue

于 2011-11-16T00:41:32.963 回答