2009-04-24 3 views
10

Я пытаюсь выводить такие вещи, как 안, 蠀, ☃ от Cunicode hello world для C?

#include <wchar.h> 
int main() 
{ 
    fwprintf(stdout, L"안, 蠀, ☃\n"); 
    return 0; 
} 

выход?,?,?

Как напечатать эти символы?

Edit:

#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?

+0

Вы используете Windows или Linux? – Zifre

+0

Черт, что-то не так с моим компьютером, потому что я тоже вижу? в примере кода! – alvatar

+4

Попробуйте установить кодировку в Unicode (UTF-8) (в Firefox, View-> Кодировка символов) –

ответ

1

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

+0

Я использую linux. $ locale все установлено в en_US.utf8 – numeric

9

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

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

$ LANG=en.UTF-8 

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

4

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

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

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

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

тогда

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

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

+0

wchar_t не обязательно многобайтовый - он может быть одним байтом. – 2009-04-24 21:23:25

+0

Ну да, я должен был быть более педантичным :-) – dirkgently

6

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

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

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

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

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

0

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

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

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