c ++ массив wchar_t и массив char в программировании для консоли win32

Я пишу программу, включающую вывод китайских символов с использованием Dev C ++.

я добавил
-finput-кодировка = big5
-fexec-кодировка = big5
в параметрах компилятора. Я также установил кодовую страницу консоли на 950 (традиционный китайский)

Он отлично работает, когда в простой cout, как это:

cout << "中文字";

в то время как в массиве символов происходит ошибка

char chin[] = "中文字";
cout << chin[0];//output nothing
cout << chin[0] << chin[1];//output the first chinese character as one chinese character occupies 2 bytes.

Поэтому я решил использовать wchar_t вместо этого, и я должен использовать wcout с wchar_t, иначе будет показано число.

Однако wcout ничего не показывает в консоли. Все нижеприведенное ничего не показывает:

wcout << L"中文字";
wchar_t chin2[] = L"中文字";
wcout << chin2[0];

Что я пропустил, чтобы использовать wchar_t для вывода китайских (или других восточноазиатских) символов? Я действительно не хочу писать 2 члена массива, чтобы показать один китайский символ.

1

Решение

Здесь есть тонкие проблемы.

Компилятор C ++ не понимает кодировку Big5. Когда вы создаете файл исходного кода и отображаете его, вы можете увидеть ваши знакомые китайские символы, но компилятор видит строку байтов. Big5 — это двухбайтовая кодировка, поэтому каждый входной символ будет представлен 2 байтами внутри компилятора.

Когда эта строка байтов подается на подходящее устройство вывода, китайские символы появляются снова. Кодовая страница 950 совместима с Big5, поэтому вы видите «правильную» вещь. Но затем вы пытаетесь опираться на это, и в результате возникает путаница. Ваш второй пример кода использует L «» строки, но я ожидаю, что эти строки будут содержать половину символа в каждой короткой строке.

Единственный «безопасный» набор символов, который вы можете использовать, — это Unicode. Исторически внутренними компонентами Windows являются UCS-2 (char — одиночное короткое), но теперь теоретически UTF-16 (char — короткое, но может включать многобайтовые последовательности). Не все существующие программы и более старые API полностью поддерживают UTF-16 (или должны). Windows имеет очень ограниченную поддержку UTF-8 или других кодировок. Все конвертируется в Unicode, поэтому лучше просто оставить все как есть.

На практике вы должны создать свой код C ++ с настройками Unicode для UCS-2 и проявлять осторожность, если вам нужны символы, которые требуют многобайтовых последовательностей. Вы должны убедиться, что любой исходный код, который вы пишете, и любые входные текстовые файлы идентифицируются в той кодировке, в которой они нуждаются, но внутренне переводятся в Unicode. Оставьте вашу консоль как кодировку Unicode по умолчанию, и все будет работать.

Практически невозможно разумно использовать Big5 в качестве внутренней кодировки в программе Windows. Лучше не пытаться.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector