Убедитесь, что ваш просмотрщик / редактор / терминал (однако вы взаимодействуете с вашим файлом, закодированным в utf-8) можете прочитать файл. Это часто возникает в Windows , например, «Блокнот».
Написание текста в текстовом файле в формате Unicode?
blockquote>In Python 2, используйте
open
из модуляio
(это то же самое, что встроенныйopen
в Python 3):import io
Лучшая практика, в общем, использует
UTF-8
дляencoding = 'utf-8'
utf-8 - это самая современная и универсально используемая кодировка - она работает во всех веб-браузерах , большинство текстовых редакторов (см. ваши настройки, если у вас есть проблемы) и большинство терминалов / оболочек.
В Windows вы можете попробовать
utf-16le
, если вы ограничены просмотром вывода в Блокноте (или другом ограниченном viewer).encoding = 'utf-16le' # sorry, Windows users... :(
И просто откройте его с помощью диспетчера контекстов и напишите символы юникода:
with io.open(filename, 'w', encoding=encoding) as f: f.write(unicode_object)
Пример использования многих символов Юникода
Вот пример, который пытается сопоставить все возможные символы шириной до трех бит (4 - макс, но это будет немного далеко) от цифрового r epresentation (в целых числах) к выходу с кодированной печатаемой записью вместе с ее именем (поместите это в файл с именем
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
My Python 3.5 из Anaconda имеет unicode 8.0, я бы предположил, что большинство 3 будет.