有什么可以想象的原因为什么我会看到使用 unicode 字符串文字与 UChar 的实际十六进制值不同的结果。
UnicodeString s1(0x0040); // @ sign
UnicodeString s2("\u0040");
s1 不等于 s2。为什么?
有什么可以想象的原因为什么我会看到使用 unicode 字符串文字与 UChar 的实际十六进制值不同的结果。
UnicodeString s1(0x0040); // @ sign
UnicodeString s2("\u0040");
s1 不等于 s2。为什么?
\u 转义序列 AFAIK 是实现定义的,因此在不了解特定编译器的详细信息的情况下,很难说它们为什么不等价。也就是说,这根本不是一种安全的做事方式。
UnicodeString 有一个使用 UChar 和一个用于 UChar32 的构造函数。使用它们时我会很明确:
UnicodeString s(static_cast<UChar>(0x0040));
UnicodeString 还提供了一个相当方便的unescape()方法:
UnicodeString s = UNICODE_STRING_SIMPLE("\\u4ECA\\u65E5\\u306F").unescape(); // 今日は
无法在 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
对于其他找到这个的人,这就是我发现的(在 ICU 的文档中)。
编译器和运行时字符集的代码页编码未由 C/C++ 语言标准指定,并且通常不是 Unicode 编码形式。它们通常取决于各个系统、进程或线程的设置。因此,不可能直接使用 C/C++ 字符或字符串文字实例化 Unicode 字符或字符串变量。唯一安全的方法是使用数值。对于已翻译的用户界面 (UI) 字符串,这不是问题。
\u
常量中的双引号是问题所在。这正确评估:
wchar_t m1( 0x0040 );
wchar_t m2( '\u0040' );
bool equal = ( m1 == m2 );
equal
是true
。