2015-07-30 3 views
3

У меня есть программа, в которой я хочу использовать некоторые символы Unicode, такие как μ и индекс p. Когда я делаю это,Unicode escape не работает с некоторыми символами

print u"\xb5" 

это работает отлично, но когда я делаю это,

print u"\u209A" 

Я получаю сообщение об ошибке:

Traceback (most recent call last): 
    File "C:/Users/tech/Desktop/Circuit Design Tool/Test 2.py", line 1, in <module> 
    print u"\u209A" 
    File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_table) 
UnicodeEncodeError: 'charmap' codec can't encode character u'\u209a' in position 0: character maps to <undefined> 

Почему это происходит? Являются ли эти правильные escape-коды unicode?

+0

'печать и«\ u209A».encode («utf8»)' – heinst

+0

Что вы используете для консоли?Когда я использую командную строку Windows, я получаю 'cp437', который работает аналогично, и когда я использую Idle, я получаю' utf-8', который не генерирует ошибку, но также не печатает правильный символ. –

ответ

0

Это связано с тем, что кодировка по умолчанию вашей консоли - cp1252, и она не может декодировать ваш Unicode. Вместо этого вам нужна другая правильная кодировка, например utf-8.

С кодировкой по умолчанию моего терминала utf-8 печатает правильно:

>>> print u"\u209A" 
ₚ 

Но если я использую кодировку cp1252 это вызовет ошибку, как то, что вы получили:

>>> u"\u209A".encode('cp1252') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.4/encodings/cp1252.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_table) 
UnicodeEncodeError: 'charmap' codec can't encode character '\u209a' in position 0: character maps to <undefined> 
>>> 

Вы может изменить кодировку по умолчанию на utf8, используя следующую команду в Windows:

chcp 65001 

ИЛИ Вы также можете изменить его графический проверить этот вопрос для получения дополнительной информации: Unicode characters in Windows command line - how?

+0

Это не тот персонаж, которого я хотел; Мне нужен индекс. Нужно ли использовать другой выход из Unicode? – jmcampbell

+0

@jmcampbell Что вы подразумеваете под 'unicode escape'? вы имеете в виду еще одну кодировку в Юникоде? – Kasramvd

+0

Я имею в виду строку unicode. Например, u "\ xb5" - это escape-код unicode на python для греческой буквы mu. u "\ u209A" должен быть unicode escape для индекса p, но он не дает правильного символа. – jmcampbell

0

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

chcp 65001 

Для других таких кодировок и их соответствующих кодовых страниц (сП), проверить его here.

1

Консоль Windows просто не поддерживает Unicode для приложений, использующих функции ввода-вывода стандартной библиотеки C (например, Python).

В принципе, вы можете, как следует из других комментариев, изменить кодовую страницу на 65001 (и установить переменную среды PYTHONIOENCODING в соответствие с utf-8), на практике в поддержке хоста консоли присутствуют некоторые давние ошибки для этой кодовой страницы, чтобы при попытке ее использования вы могли получать двойные отпечатки или зависания. Обычно это непригодно.

Надежный способ получить Unicode из консоли Windows (ну, так надежны, как вы получите, пользователь по-прежнему должен быть выбран в TTF шрифт стоять любой шанс увидеть его), чтобы вызвать Win32 WriteConsoleW/ReadConsoleW функции напрямую, а не полагаться на C stdlib. Если вам действительно необходимо сделать это, пакет win_unicode_console упакует его для вас.

(Как правило, проще вариант махнуть на консоли Windows, и использовать другие среды, как IDE.)

+0

Чтобы быть ясным, я в конце концов хотел бы использовать это в среде IDE, а не просто работать в консоли. Может ли связанный с вами пакет помочь мне там? – jmcampbell

+0

win_unicode_console не должен ничего делать в других средах, кроме консоли Windows. IDE с их собственными REPL должны, как правило, поддерживать Unicode, естественно, без каких-либо особых действий (хотя в некоторых из них были ошибки в прошлом). – bobince

Смежные вопросы