Unicode hello world для C?

Я пытаюсь вывести такие вещи, как 안, 蠀, ☃ из 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?

Ответ 1

Вы должны установить выходной терминал как совместимый с Unicode.

В Linux (с оболочкой Bash) попробуйте:

$ LANG=en.UTF-8

а также убедитесь, что ваш эмулятор терминала действительно может отображать Unicode и настроен для этого.

Ответ 2

В процессе получения Unicode есть много отдельных этапов - все они должны быть правильно настроены.

Во-первых, вы компилируете с поддержкой unicode? вам нужно будет сделать это под Windows (-D UNICODE -D __UNICODE).

Во-вторых, вы испускаете командную строку, которая поддерживает unicode, как в принципе, так и с шрифтом, содержащим глифы символов, которые вы используете?

В-третьих, выполняются кодировки Юникода, используемые вашим компилятором и вашей командной строкой? не нужно использовать UCS2 в вашем двоичном файле, когда ваша командная строка ожидает UTF8.

Вам в основном нужно понимать Unicode и его кодировки, чтобы понять это правильно. Не представляйте себе это прямолинейно или вам не нужно изучать все основные понятия; этот материал не срабатывает случайно, потому что слишком много вещей, которые должны быть точно верны.

Ответ 3

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"? выход.

Ответ 4

Вы должны настроить свою систему для приема этих символов. Что вы используете? Windows, Linux?

Ответ 5

Так же, как предложил Алнитак, нужно указать язык с набором символов/кодировкой, который включает символы, которые вы хотите показать. (Unicode/) UTF-8 должен охватывать все символы Unicode.

Ваш терминал должен использовать шрифт с соответствующими глифами.

Windows 'CMD.EXE, как известно, слаб, когда речь идет о наборах символов за пределами 8 бит. Возможно, вам понадобится панель GUI вместо того, чтобы полагаться на stdout.