2015-10-09 3 views
3

Я написал код для создания всех 4-значных комбинаций шестнадцатеричной системы, и теперь я пытаюсь использовать их для печати всех символов Юникода, связанных с этими значениями. Вот код, я использую, чтобы сделать это:Печать всех символов Юникода в Python

char_list =["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"] 
pairs = [] 
all_chars = [] 

# Construct pairs list 
for char1 in char_list: 
    for char2 in char_list: 
     pairs.append(char1 + char2) 

# Create every combination of unicode characters ever 
    for pair1 in pairs: 
     for pair2 in pairs: 
      all_chars.append(pair1 + pair2) 

# Print all characters 
for code in all_chars: 
    expression = "u'\u" + code + "'" 
    print "{}: {}".format(code,eval(expression)) 

А вот сообщение об ошибке я получаю:

Traceback (most recent call last): File "C:\Users\andr7495\Desktop\unifun.py", 
line 18, in <module> print "{}: {}".format(code,eval(expression)) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\x80' in position 0: 
ordinal not in range(128) 

Исключение генерируется, когда код пытается напечатать U "\ u0080 », однако, я могу сделать это в интерактивном интерпретаторе без проблем.

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

+0

пытаются избежать Eval, особенно в цикле –

+0

'и "\ u0080"' это [символ управления] (http://www.fileformat.info/info/ unicode/char/0080/index.htm) ... может быть, вы не можете распечатать это? – tom

+0

@tom особенно, если он печатает на стандартные окна cmd.exe: P –

ответ

0

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

print u"{}: {}".format(code,eval(expression)) 
    ^

Другие ответы лучше упростить исходную задачу, однако, вы, безусловно, делать вещи трудный путь.

0

Вероятно, проблема с вашим терминалом (cmd.exe, как известно, это плохо), поскольку большую часть времени, когда вы «печатаете», вы печатаете на терминал, и это заканчивается попыткой делать кодировки ... if вы запускаете свой код в режиме ожидания или в каком-либо другом пространстве, которое может отображать unicode, вы должны видеть символы. Кроме того, вы не должны использовать Eval попробовать это

for uni_code in range(...): 
    print hex(uni_code),unichr(uni_code) 
9
import sys 
for i in xrange(sys.maxunicode): 
    print unichr(i); 
+1

'sys.maxunicode' является лучшим верхним пределом. –

+0

@MarkTolonen, хороший момент, спасибо Марк. Обновлено. –

+0

или даже лучше: 'sys.maxunicode + 1' (для обработки' U + 10FFFF' несимвольных как другие несимволы). – jfs

0

Вот список примеров в этой статье, который сохраняет список в файл.

Python 3.x:

import sys 
txtfile = "unicode_table.txt" 
print("creating file: " + txtfile) 
F = open(txtfile, "w", encoding="utf-16", errors='ignore') 
for uc in range(sys.maxunicode): 
    line = "%s %s" % (hex(uc), chr(uc)) 
    print(line, file=F) 
F.close()