Предисловие: будет ли работать ваш просмотрщик?
Убедитесь, что ваш просмотрщик / редактор / терминал (однако вы взаимодействуете с файлом в кодировке utf-8) может прочитать файл.Это часто проблема в Windows , например, в Блокноте.
Запись текста Unicode в текстовый файл?
В Python 2 используйтеopen
из модуля io
(это то же самое, что встроенный open
в Python 3):
import io
В общем, рекомендуется использовать UTF-8
для записи в файлы (мыдаже не нужно беспокоиться о порядке следования байтов с utf-8).
encoding = 'utf-8'
utf-8 - это самая современная и универсально используемая кодировка - она работает во всех веб-браузерах, в большинстве текстовых редакторов (посмотрите ваши настройки, если у вас есть проблемы) и большинство терминалов / оболочек.
В Windows вы можете попробовать utf-16le
, если вы ограничены просмотром вывода в Блокноте (или другом ограниченном средстве просмотра).
encoding = 'utf-16le' # sorry, Windows users... :(
И просто откройте его с помощью диспетчера контекста и напишите свои символы Юникода:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Пример использования множества символов Юникода
Вот пример, который пытается сопоставить все возможные символышириной до трех бит (4 - максимум, но это будет немногодалеко) от цифрового представления (в целых числах) до закодированного печатаемого вывода вместе с его именем, если это возможно (поместите это в файл с именем uni.py
):
from __future__ import print_function
import io
from unicodedata import name, category
from curses.ascii import controlnames
from collections import Counter
try: # use these if Python 2
unicode_chr, range = unichr, xrange
except NameError: # Python 3
unicode_chr = chr
exclude_categories = set(('Co', 'Cn'))
counts = Counter()
control_names = dict(enumerate(controlnames))
with io.open('unidata', 'w', encoding='utf-8') as f:
for x in range((2**8)**3):
try:
char = unicode_chr(x)
except ValueError:
continue # can't map to unicode, try next x
cat = category(char)
counts.update((cat,))
if cat in exclude_categories:
continue # get rid of noise & greatly shorten result file
try:
uname = name(char)
except ValueError: # probably control character, don't use actual
uname = control_names.get(x, '')
f.write(u'{0:>6x} {1} {2}\n'.format(x, cat, uname))
else:
f.write(u'{0:>6x} {1} {2} {3}\n'.format(x, cat, char, uname))
# may as well describe the types we logged.
for cat, count in counts.items():
print('{0} chars of category, {1}'.format(count, cat))
Это должно выполняться в следующем порядкеоколо минуты, и вы можете просмотреть файл данных, и если ваша программа просмотра файлов может отображать Unicode, вы увидите его.Информацию о категориях можно найти здесь .Основываясь на подсчете, мы, вероятно, можем улучшить наши результаты, исключив категории Cn и Co, с которыми не связаны никакие символы.
$ python uni.py
Будет отображено шестнадцатеричное отображение, category , символ (если не может получить имя, поэтому, вероятно, управляющий символ) и имя символа.Например,
Я рекомендую less
в Unix или Cygwin (не печатать / не катать весь файл на выходе):
$ less unidata
Например, будет отображаться аналогично следующим строкам, которые явзяты из него с использованием Python 2 (Unicode 5.2):
0 Cc NUL
20 Zs SPACE
21 Po ! EXCLAMATION MARK
b6 So ¶ PILCROW SIGN
d0 Lu Ð LATIN CAPITAL LETTER ETH
e59 Nd ๙ THAI DIGIT NINE
2887 So ⢇ BRAILLE PATTERN DOTS-1238
bc13 Lo 밓 HANGUL SYLLABLE MIH
ffeb Sm → HALFWIDTH RIGHTWARDS ARROW
Мой Python 3.5 от Anaconda имеет Unicode 8.0, я бы предположил, что большинство 3-х будет.