Как печатать Юникод, как "u {variable}" в Python 2.7?

Zaid Tariq спросил: 28 марта 2018 в 03:10 в: python

Например, я могу напечатать символ Unicode, например:

print u'\u00E0'

Или

a = u'\u00E0'
print a

Но похоже, что я не могу сделайте что-то вроде этого:

a = '\u00E0'
print someFunctionToDisplayTheCharacterRepresentedByThisCodePoint(a)

Основной пример использования будет в циклах. У меня есть список кодов юникода, и я хочу отобразить их на консоли. Что-то вроде:

with open("someFileWithAListOfUnicodeCodePoints") as uniCodeFile:
    for codePoint in uniCodeFile:
        print codePoint #I want the console to display the unicode character here

В файле есть список кодов Unicode. Например:

2109
OOBO
00E4
1F1E6

Цикл должен выводиться:

℉
°
ä
?  

Любая помощь будет оценена!


3 ответа

chepner ответил: 28 марта 2018 в 03:55

Это, вероятно, не очень хороший способ, но это начало:

>>> x = '00e4'
>>> print unicode(struct.pack("!I", int(x, 16)), 'utf_32_be')
ä

Сначала мы получаем целое число, представленное шестнадцатеричной строкой x. Мы упаковываем это в байтовую строку, которую затем можем декодировать, используя кодировку utf_32_be.

Поскольку вы делаете это много, вы можете предварительно скомпилировать структуру:

int2bytes = struct.Struct("!I").pack
with open("someFileWithAListOfUnicodeCodePoints") as fh:
    for code_point in fh:
        print unicode(int2bytes(int(code_point, 16)), 'utf_32_be')

Если вы думаете, что это понятнее, вы можете также использовать метод decode вместо типа unicode:

>>> print int2bytes(int('00e4', 16)).decode('utf_32_be')
ä

Python 3 добавил класс to_bytes в класс int, который позволяет обойти модуль struct:

>>> str(int('00e4', 16).to_bytes(4, 'big'), 'utf_32_be')
"ä"
Zaid Tariq ответил: 28 марта 2018 в 03:54
Да, это работает! Но я надеюсь, что кто-то публикует более простой способ. Это слишком сложно для моего уровня. Большое спасибо! Я буду использовать это сейчас.
tdelaney ответил: 28 марта 2018 в 05:02

Это кодовые точки Юникода, но в них отсутствует \u Python Unicode-escape. Итак, просто вставьте это в:

with open("someFileWithAListOfUnicodeCodePoints", "rb") as uniCodeFile:
    for codePoint in uniCodeFile:
        print "\\u" + codePoint.strip()).decode("unicode-escape")

Работает ли это в данной системе, зависит от кодировки консоли. Если это кодовая страница Windows и символы находятся за пределами ее диапазона, вы все равно получите странные ошибки.

В Python 3 это будет b"\\u".

Mark Tolonen ответил: 29 марта 2018 в 04:51

Вы хотите print unichr(int('00E0',16)). Преобразуйте шестнадцатеричную строку в целое число и напечатайте ее кодовую точку Unicode.

Предупреждение: В кодовых точках Windows > U + FFFF не будет работать.

Решение: используйте Python 3.3+ print(chr(int(line,16)))

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