юникод привет мир для 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?


person numeric    schedule 24.04.2009    source источник
comment
Вы используете Windows или Linux?   -  person Zifre    schedule 25.04.2009
comment
блин, с моим компьютером что-то не так, потому что я тоже их вижу? в примере кода!   -  person alvatar    schedule 25.04.2009
comment
Попробуйте установить кодировку Unicode (UTF-8) (в Firefox, Просмотр- ›Кодировка символов)   -  person Lucas Jones    schedule 25.04.2009
comment
Я вижу анг на корейском, ci на китайском и снеговика. Это не привет, мир ни на одном из этих языков.   -  person CookieOfFortune    schedule 25.04.2009
comment
Ваше редактирование (со строкой setlocale) работает для меня в Mac OS X под Apple Terminal.app, а также urxvt; У меня LANG = en_US.UTF-8. Возможно, у вас не установлены шрифты, включающие китайский иероглиф и снеговика.   -  person Brian Campbell    schedule 25.04.2009
comment
utf8everywhere.org научит вас делать текст в окнах.   -  person Pavel Radzivilovsky    schedule 11.09.2012


Ответы (5)


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

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

$ LANG=en.UTF-8

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

person Alnitak    schedule 24.04.2009

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

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

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

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

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

person Community    schedule 24.04.2009

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

person dirkgently    schedule 24.04.2009
comment
wchar_t не обязательно многобайтовый - он может быть длиной в один байт. - person ; 25.04.2009
comment
Ну да, надо было быть более педантичным :-) - person dirkgently; 25.04.2009

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

person Fabio Vinicius Binder    schedule 24.04.2009
comment
я использую Linux. $ locale установлен на en_US.utf8 - person numeric; 25.04.2009

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

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

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

person eel ghEEz    schedule 24.04.2009