Unicode Привет, мир для C? - PullRequest
       8

Unicode Привет, мир для C?

10 голосов
/ 25 апреля 2009

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

Ответы [ 5 ]

9 голосов
/ 25 апреля 2009

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

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

$ LANG=en.UTF-8

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

6 голосов
/ 25 апреля 2009

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

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

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

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

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

4 голосов
/ 25 апреля 2009

C wchar_t определяется как:

Тип wchar_t - это отдельный тип, значения которого могут представлять различные коды для всех членов наибольшего расширенного набора символов, указанного среди поддерживаемых локалей (22.1.1). [...]

Разница между многобайтовыми символами и wchar_t:

многобайтовым символам может потребоваться более одного байта для данного символа в зависимости от кодировки (например, UTF-8, UTF-16)

тогда * * 1016

wchar_t имеет фиксированный размер, то есть sizeof (wchar_t), который определяется реализацией. Обратите внимание, что эта ширина определяет, какую кодировку (ы) может поддерживать wchar_t. Таким образом, если sizeof(wchar_t) == 2 нет способа использовать кодировку UTF-32.

Также помните, что wchar_t само по себе не имеет смысла кодирования. Сначала вы должны указать компилятору, какую кодировку он должен использовать для wchar_t данных. Ошибочный вывод наиболее вероятен, потому что символы обрабатываются в кодировке по умолчанию, которая не может должным образом поддерживать эти символы, и неудачное совпадение приводит к стилю «notdef»? выход.

1 голос
/ 25 апреля 2009

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

0 голосов
/ 25 апреля 2009

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

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

Windows 'CMD.EXE общеизвестно слаб, когда речь идет о наборах символов, превышающих 8 бит. Возможно, вам потребуется панель с графическим интерфейсом вместо того, чтобы полагаться на стандартный вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...