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