Unicode文字列リテラルを使用した場合とUCharの実際の16進値を使用した場合で異なる結果が表示される理由は考えられますか?
UnicodeString s1(0x0040); // @ sign
UnicodeString s2("\u0040");
s1はs2と同等ではありません。なんで?
Unicode文字列リテラルを使用した場合とUCharの実際の16進値を使用した場合で異なる結果が表示される理由は考えられますか?
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のドキュメントで)。
コンパイラおよびランタイム文字セットのコードページエンコーディングは、C / C ++言語標準で指定されておらず、通常はUnicodeエンコーディング形式ではありません。これらは通常、個々のシステム、プロセス、またはスレッドの設定によって異なります。したがって、Unicode文字または文字列変数をC /C++文字または文字列リテラルで直接インスタンス化することはできません。安全な唯一の方法は、数値を使用することです。翻訳されるユーザーインターフェイス(UI)文字列の問題ではありません。
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
\u
定数の二重引用符が問題です。これは適切に評価されました:
wchar_t m1( 0x0040 );
wchar_t m2( '\u0040' );
bool equal = ( m1 == m2 );
equal
でしたtrue
。