Ответ 1
Вы должны установить выходной терминал как совместимый с Unicode.
В Linux (с оболочкой Bash) попробуйте:
$ LANG=en.UTF-8
а также убедитесь, что ваш эмулятор терминала действительно может отображать Unicode и настроен для этого.
Я пытаюсь вывести такие вещи, как 안, 蠀, ☃ из C
#include <wchar.h>
int main()
{
fwprintf(stdout, L"안, 蠀, ☃\n");
return 0;
}
вывод:?,?,?
Как напечатать эти символы?
Изменить:
#include <wchar.h>
#include <locale.h>
int main()
{
setlocale(LC_CTYPE, "");
fwprintf(stdout, L"안, 蠀, ☃\n");
return 0;
}
Это сделал трюк. выход - 안, 蠀, ☃. кроме того, что китайский персонаж и снеговик появляются как ящик в моем urxvt, вероятно, потому, что я не включил эти локали.
$ locale -a
C
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
ja_JP.utf8
ko_KR
ko_KR.euckr
ko_KR.utf8
korean
korean.euc
POSIX
zh_CN.utf8
какой языковой стандарт мне нужно включить дополнительно, чтобы он отображал китайского персонажа и снеговика? возможно, мне нужен шрифт?
будет ли вышеуказанная программа работать в Windows?
Вы должны установить выходной терминал как совместимый с Unicode.
В Linux (с оболочкой Bash) попробуйте:
$ LANG=en.UTF-8
а также убедитесь, что ваш эмулятор терминала действительно может отображать Unicode и настроен для этого.
В процессе получения Unicode есть много отдельных этапов - все они должны быть правильно настроены.
Во-первых, вы компилируете с поддержкой unicode? вам нужно будет сделать это под Windows (-D UNICODE -D __UNICODE).
Во-вторых, вы испускаете командную строку, которая поддерживает unicode, как в принципе, так и с шрифтом, содержащим глифы символов, которые вы используете?
В-третьих, выполняются кодировки Юникода, используемые вашим компилятором и вашей командной строкой? не нужно использовать UCS2 в вашем двоичном файле, когда ваша командная строка ожидает UTF8.
Вам в основном нужно понимать Unicode и его кодировки, чтобы понять это правильно. Не представляйте себе это прямолинейно или вам не нужно изучать все основные понятия; этот материал не срабатывает случайно, потому что слишком много вещей, которые должны быть точно верны.
C wchar_t
определяется как:
Тип
wchar_t
- это отдельный тип, значения которого могут представлять разные коды для всех членов самого большого расширенного набора символов, указанного среди поддерживаемых локалей (22.1.1). [...]
Разница между многобайтными символами и wchar_t
:
многобайтовые символы могут требовать более одного байта для заданного символа в зависимости от кодирования (например, UTF-8, UTF-16)
тогда
wchar_t
имеет фиксированный размер, то есть sizeof (wchar_t), который является реализацией. Обратите внимание, что эта ширина определяет, какие кодировки могут поддерживаться вашимwchar_t
. Итак, еслиsizeof(wchar_t) == 2
, вы не сможете использовать кодировку UTF-32.
Также помните, что wchar_t
не имеет смысла кодирования сам по себе. Сначала вам нужно сообщить компилятору, какую кодировку он должен использовать для данных wchar_t
. Ошибочный вывод, скорее всего, объясняется тем, что символы обрабатываются по умолчанию, что не может поддерживать эти символы должным образом, а неудачное совпадение приводит к стилю "notdef"? выход.
Вы должны настроить свою систему для приема этих символов. Что вы используете? Windows, Linux?
Так же, как предложил Алнитак, нужно указать язык с набором символов/кодировкой, который включает символы, которые вы хотите показать. (Unicode/) UTF-8 должен охватывать все символы Unicode.
Ваш терминал должен использовать шрифт с соответствующими глифами.
Windows 'CMD.EXE, как известно, слаб, когда речь идет о наборах символов за пределами 8 бит. Возможно, вам понадобится панель GUI вместо того, чтобы полагаться на stdout.