2010-07-24 3 views
8

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

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

#define MY_STRING 鸟 

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

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

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

+4

Какой компилятор вы используете? Многие компиляторы (особенно старые компиляторы) не поддерживают источник unicode (последние компиляторы будут поддерживать универсальные имена символов). –

+3

http://stackoverflow.com/questions/331690/c-source-in-unicode –

+0

Я использую g ++, предположительно из mingw, установленного QT. –

ответ

8

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

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

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

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

2

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

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

5

Используя L префикс и \u или \U обозначения для побега символов Unicode:

Section 6.4.3 of the C99 specification определяющего \u управляющих последовательностями.

Пример:

#define MY_STRING L"A \u8801 B" 
/* A congruent-to B */ 
+1

** 'U + 8801' ** - [личинки Unicode Han Character, личинки] (http://www.fileformat.info/info/unicode/char/8801/index.htm). В вашем примере вы вместо этого намеревались использовать символ из [Unicode Characters в категории «Symbol, Math»] (http://www.fileformat.info/info/unicode/category/Sm/list.htm)? – DavidRR

+1

@DavidRR: Это [имеет гораздо больше смысла] (http://www.fileformat.info/info/unicode/char/2261/index.htm). Обозначение Unicode указано в шестнадцатеричном формате. Возможно, Хит смешивал эту нотацию с HTML, которая по умолчанию десятична. – usr2564301

+0

@ Jongware: Да, хороший улов. Хит, вероятно, предназначался «\ u2261» (ИДЕНТИЧНЫЙ ТО). – DavidRR

Смежные вопросы