UnicodeString со строковыми литералами и шестнадцатеричными значениями - PullRequest
0 голосов
/ 16 ноября 2011

Существует ли какая-либо мыслимая причина, по которой я мог бы видеть разные результаты, используя строковые литералы Юникода в сравнении с фактическим шестнадцатеричным значением для UChar.

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

s1 не эквивалентно s2. Почему?

Ответы [ 4 ]

1 голос
/ 20 июня 2012

escape-последовательность AFAIK определяется реализацией, поэтому трудно сказать, почему они не эквивалентны, не зная подробностей о вашем конкретном компиляторе. Тем не менее, это просто не безопасный способ делать вещи.

UnicodeString имеет конструктор, принимающий UChar и один для UChar32. Я бы был явным при их использовании:

UnicodeString s(static_cast<UChar>(0x0040));

UnicodeString также предоставляет метод unescape () , который довольно удобен:

UnicodeString s = UNICODE_STRING_SIMPLE("\\u4ECA\\u65E5\\u306F").unescape(); // 今日は
0 голосов
/ 16 ноября 2011

не удалось воспроизвести на 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.length: 1 s2.length: 1

s1.charAt (0) = U + 0040 s2.charAt (0) = U + 0040

gcc 4.4.5 RHEL 6.1 x86_64

0 голосов
/ 16 ноября 2011

Для всех, кто найдет это, вот что я нашел (в документации ICU).

Кодировки кодовых страниц компилятора и набора времени выполнения не определены стандартами языка C / C ++ иобычно это не кодировка Unicode.Обычно они зависят от настроек отдельной системы, процесса или потока.Следовательно, невозможно создать экземпляр символа Unicode или строковую переменную непосредственно с помощью символа C / C ++ или строковых литералов.Единственный безопасный способ - использовать числовые значения.Это не проблема для переведенных строк интерфейса пользователя.

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

0 голосов
/ 16 ноября 2011

Двойные кавычки в вашей константе \u являются проблемой.Это оценивалось правильно:

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

equal было true.

...