2011-10-03 3 views
12

C++ 11 представляет новый набор префиксов строковых литералов (и даже позволяет определять суффиксы, заданные пользователем). Кроме того, вы можете напрямую использовать escape-последовательности Unicode для кодирования определенного символа, не беспокоясь о кодировании.Строковые литералы Unicode

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

Но я могу использовать последовательности юникода побега в wchar_t строковых литералов, а? Казалось бы, это был недостаток, если это было невозможно.

const wchar_t* sw = L"\u00DA"; 

Целое значение sw[0] будет, конечно, зависеть от того, что wchar_t на конкретной платформе, но и ко всем другим эффектам, это должно быть портативным, нет?

+0

Я считаю, что значение 'SW [0]' зависит от того, что 'wchar_t' на конкретной платформе только в той степени, каков размер 'wchar_t'. То есть '\ u00DA' всегда должен приводить к кодировке Unicode (UTF-8, UTF-16, UTF-32) U + 00DA, даже если это не стандартная кодировка платформы для этого типа. – bames53

+1

На самом деле вышеуказанное неверно. Предполагается, что реализация должна рассматривать универсальные имена символов, поскольку это будет буквальный характер. Поэтому, если реализация преобразует символы в строковый литерал в набор символов выполнения, тогда он также должен делать это с UCN. Вам гарантируется только кодировка UTF, если UCN находится внутри литерала unicode (например, u8 "\ u00DA"). – bames53

ответ

8

Это сработает, но может не иметь желаемой семантики. \u00DA будет расширяться на столько целевых символов, сколько необходимо для кодировки UTF8/16/32, в зависимости от размера wchar_t, но имейте в виду, что в широких строках нет какой-либо задокументированной гарантированной семантики кодирования - они просто «системные кодирование ", без попытки сказать, что это такое, или потребовать от пользователя знать что это такое.

Так что лучше не смешивать и не сочетать. Используйте либо один, но не оба, из двух:

  1. конкретной системы: char*/"", wchar_t*/L"", \x -literals, mbstowcs/wcstombs

  2. Unicode: char*/u8"", char16_t*/u"", char32_t*/U"", \u/\U литералов.

(Вот somerelatedquestions шахты на эту тему.)

+0

Для получения полной информации о предыстории этого вопроса, [этот тест libC++] (http://llvm.org/svn/llvm-project/libcxx/trunk/test/localization/locale.categories/category.ctype/locale .ctype.byname/is_1.pass.cpp) не работает в Windows в строке '\ x00DA'. Интересно, могу ли я заменить это на '\ u00DA' и заставить его работать для всех' wchar_t', которые достаточно велики (т.е. 16 или 32-разрядные) – rubenvb