UnicodeString /字符串字面值vs十六进制值

UnicodeString w/ String Literals vs Hex Values

本文关键字:十六进制 vs 字面值 字符串 UnicodeString      更新时间:2023-10-16

使用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: %sn", (s1==s2)?"T":"F");
  //  printf("s1.equals s2: %dn", s1.equals(s2));
  printf("s1.length: %d  s2.length: %dn", s1.length(), s2.length());
  printf("s1.charAt(0)=U+%04X s2.charAt(0)=U+%04Xn", 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编码形式。它们通常依赖于单个系统、进程或线程。因此,这是不可能的来实例化Unicode字符或字符串变量C/c++字符或字符串字面值。唯一安全的方法就是使用数值。对于用户界面(UI)字符串来说,这不是问题

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

u常量中的双引号是问题所在。正确计算:

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

equaltrue