UnicodeString w / String Literals vs Hex值

时间:2011-11-15 23:59:31

标签: c++ unicode internationalization icu unicode-string

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

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

s1不等于s2。为什么呢?

4 个答案:

答案 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)字符串不是问题   已翻译。

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

答案 3 :(得分:-1)

\u常量中的双引号是问题所在。这评估得恰到好处:

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

equaltrue

相关问题