2013-04-05 4 views
1

Как печатать некоторые символы Юникода? Хотя я устанавливаю кодировку UTF-8, я не могу ее распечатать. Я получаю символы Unicode в шестнадцатеричном виде (c2 82 c2 81 c2 80 0) в непрерывном потоке байтов. Но когда я попытался напечатать свой символ Юникода, указав сначала указатель на символ, он не печатает. Зачем?Почему эти символы Unicode не печатаются, хотя я устанавливаю среду UTF8?

char s[]={0xc2,0x82,0xc2,0x81,0xc2,0x80,0x00}; 
    printf("%s",s); 

Использование C в среде Linux.

+0

Ваш 'char s []', указанный здесь, не заканчивается нулевым символом ('' \ 0''), поэтому 'printf' не может работать: it будет печатать мусор, пока он не найдет нулевой символ или будет coredump. – Fabien

+0

Я сделал, но программа не печатала никаких символов. – preabs

+0

Является ли ваш терминал настроен на использование UTF-8? Если нет, вероятно, он будет использовать 8859-1 или 8859-15 или что-то подобное, и будет интерпретировать байты в соответствии с этим набором кодов. –

ответ

4

Вы не увидите много, даже если ваш терминал настроен для работы с UTF-8, потому что символы являются «отображение» являются:

0xC2 0x82 = U+0082 
0xC2 0x81 = U+0081 
0xC2 0x80 = U+0080 

Это контрольные символы из набора C1. У меня есть файл данных, который содержит документы:

# C1 Controls (0x80 - 0x9F) are from ISO/IEC 6429:1992 
# It does not define names for 80, 81, or 99. 

80 U+0080 
81 U+0081 
82 U+0082 BPH BREAK PERMITTED HERE 

Таким образом, вы ничего не видите, потому что у вас нет графических символов. Если вы измените 0x82 на 0xA2, например (и 0x81 в 0xa1 и 0x80 до 0xa0), то вы будете более вероятно, чтобы получить какой-то видимый результат:

0xC2 0xA2 = U+00A2 
0xC2 0xA1 = U+00A1 
0xC2 0xA0 = U+00A0 

A0 U+00A0 NO-BREAK SPACE 
A1 U+00A1 INVERTED EXCLAMATION MARK 
A2 U+00A2 CENT SIGN 

$ ./x 
¢¡  
$ 

И если вы действительно хорошо, вы можете увидеть свободное место после перевернутого восклицательного знака.

+0

то, что представляют эти символы ctrl ... – preabs

+0

Они представляют собой управляющие символы; они не представляют ничего видимого, больше, чем символ новой строки, представляет что-либо видимое. (Хотя вы можете видеть побочный эффект отображения новой строки, потому что курсор меняет положение на начало новой строки, вы не можете видеть сам символ.) Не все допустимые символы видны. Например, есть незавершенное пространство нулевой ширины; вы не можете заметить это на терминале! –

+1

Помимо обычных белых пробелов CR, LF или tab, управляющие символы не имеют семантики, назначенной стандартом Unicode. –

0

0xc282c281c280 - единственное целое число. Вы хотите, чтобы инициализировать массив с последовательностью: char s[] = { 0xc2, 0x82, 0xc2, 0x81, 0xc2, 0x80, 0x00 };