Использование Unicode в исходном файле C ++ - PullRequest
8 голосов
/ 25 июля 2010

Я работаю с исходным файлом C ++, в котором я хотел бы иметь строку в кавычках, содержащую символы азиатского Юникода.

Я работаю с QT в Windows, а среда разработки QT Creator не имеетпроблема с отображением Unicode.У QStrings также нет проблем с хранением Unicode.Когда я вставляю свой Unicode, он отображается нормально, что-то вроде:

#define MY_STRING 鸟

Однако, когда я сохраняю, все мои любимые символы Unicode становятся?отмечается.

Я попытался открыть исходный файл и сохранить его в кодировке Unicode.Затем он отображается и сохраняется правильно в QT Creator.Однако при компиляции кажется, что компилятор не знает, что с этим делать, и выдает тонну ошибочных ошибок и предупреждений, таких как «stray \ 255 в программе» и «игнорируемые нулевые символы».

Как правильно включить Unicode в исходные файлы C ++?

Ответы [ 3 ]

8 голосов
/ 25 июля 2010

Лично я не использую никакие не-ASCII символы в исходном коде.Причина в том, что если вы используете произвольные символы Unicode в ваших исходных файлах, вам нужно беспокоиться о кодировке, в которой компилятор считает исходный файл, какой набор символов он будет использовать и как он будет делать источник для выполненияпреобразование набора символов.

Я думаю, что гораздо лучше иметь данные Unicode в каком-либо файле ресурсов, который может быть скомпилирован в статические данные во время компиляции или загружен во время выполнения для максимальной гибкости.Таким образом, вы можете контролировать, как происходит кодирование, не беспокоясь о том, как ведет себя компилятор, который может зависеть от локальных настроек локали во время компиляции.

Это требует немного больше инфраструктуры, но если выПри интернационализации стоит потратить время на выбор или разработку гибкой и надежной стратегии.

Хотя в исходном коде можно использовать универсальные символьные экранирования (L'\uXXXX') или явно закодированные байтовые последовательности ("\xXX\xYY\xZZ")это делает строки Unicode практически нечитаемыми для людей.Если у вас есть переводы, для большинства людей, участвующих в процессе, легче иметь дело с текстом в согласованной универсальной схеме кодировки символов.

5 голосов
/ 25 июля 2010

Использование префикса L и нотации \u или \U для экранирования символов Юникода:

Раздел 6.4.3 спецификации C99 определяет escape-последовательности \u,

Пример:

 #define MY_STRING L"A \u8801 B"   
 /* A congruent-to B */
3 голосов
/ 25 июля 2010

Используете ли вы интерфейс wchar_t? Если это так, вы хотите L"\u1234" для широкой строки, содержащей символ Unicode U + 1234 (hex 0x1234). (Глядя на файл заголовка QString, я думаю, что это то, что вам нужно.)

Если нет, и ваш интерфейс UTF-8, то вам нужно сначала закодировать ваш символ в UTF-8, а затем создать узкую строку, содержащую это, например "\xE0\xF8" или аналогичный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...