2011-10-03 12 views
12

C++ 11 wprowadza nowy zestaw prefiksów literowych (a nawet pozwala na definiowanie przez użytkownika sufiksów). Oprócz tego można bezpośrednio używać sekwencji ucieczkowych Unicode, aby zakodować określony symbol bez obawy o kodowanie.Literał ciągu Unicode

const char16_t* s16 = u"\u00DA"; 
const char32_t* s32 = U"\u00DA"; 

Ale mogę użyć sekwencje escape Unicode w wchar_t ciąg literałów, jak również? Wydaje się, że jest to wada, jeśli nie było to możliwe.

const wchar_t* sw = L"\u00DA"; 

Wartość całkowitą sw[0] będzie oczywiście zależeć od tego, co wchar_t jest na konkretnej platformie, ale do wszystkich innych efektów, powinno to być przenośny, nie?

+0

wierzę wartość 'sw [0]' zależy co 'wchar_t' jest na konkretnej platformie tylko do tego stopnia, jaki jest rozmiar 'wchar_t'. To znaczy. '\ u00DA' powinno zawsze skutkować pewnym kodowaniem Unicode (UTF-8, UTF-16, UTF-32) U + 00DA, nawet jeśli nie jest to normalne kodowanie platformy dla tego typu. – bames53

+1

Faktycznie powyższe jest nieprawidłowe. Wdrożenie ma traktować uniwersalne nazwy postaci tak, jak byłoby to dosłowne. Więc jeśli implementacja tłumaczy znaki w literale łańcuchowym na zestaw znaków wykonawczych, powinna to również zrobić z UCN. Gwarantowane jest tylko kodowanie UTF, jeśli numer UCN znajduje się w literałach unikodowych (np. U8 "\ u00DA"). – bames53

Odpowiedz

8

To zadziała, ale może nie mieć pożądanej semantyki. \u00DA rozwinie się na tyle znaków docelowych, ile potrzeba do kodowania UTF8/16/32, w zależności od rozmiaru wchar_t, ale należy pamiętać, że szerokie ciągi znaków nie mają żadnej udokumentowanej, gwarantowanej semantyki kodowania - są po prostu "systemami kodowanie ", bez podejmowania prób określenia tego, co to jest, lub wymaganie od użytkownika, aby to osiągnąć.

Najlepiej nie mieszać i dopasowywać. Użyć jednego, ale nie obydwu z nich:

  1. System specyficzne: char*/"", wchar_t*/L"", \x -literals, mbstowcs/wcstombs

  2. Unicode: char*/u8"", char16_t*/u"", char32_t*/U"", \u/\U literały.

(Oto somerelatedquestions kopalni na ten temat.)

+0

Aby uzyskać szczegółowe informacje na temat tła tego pytania, [ten test języka ++) (http://llvm.org/svn/llvm-project/libcxx/trunk/test/localization/locale.categories/category.ctype/locale .ctype.byname/is_1.pass.cpp) zawodzi w systemie Windows w linii '\ x00DA'. Zastanawiam się, czy mogę zastąpić to '' u00DA' i sprawić by działało dla wszystkich 'wchar_t' które są wystarczająco duże (np. 16 lub 32-bitowe) – rubenvb

Powiązane problemy