Используя Unicode в исходном файле C++

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

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

#define MY_STRING 鸟

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

Я пытался открыть исходный файл и повторно сохранить его как закодированный Unicode. Это затем отображает и сохраняет правильно в спокойном Создателе. Однако на компиляции, кажется, что компилятор понятия не имеет, что сделать с этим и бросает тонну дезинформированных ошибок и предупреждений, таких как "случайные \255 в программе" и "проигнорированном нулевом символе (символах)".

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

8
задан William Jones 24 July 2010 в 20:44
поделиться

3 ответа

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

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

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

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

8
ответ дан 5 December 2019 в 10:38
поделиться

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

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

Пример:

 #define MY_STRING L"A \u8801 B"   
 /* A congruent-to B */
5
ответ дан 5 December 2019 в 10:38
поделиться

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

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

3
ответ дан 5 December 2019 в 10:38
поделиться