Передмова: чи працюватиме ваш глядач?
Переконайтеся, що ваш переглядач / редактор / термінал (однак ви взаємодієте з кодованим файлом 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... :(
І просто відкрийте його за допомогою менеджера контекстів і випишіть свої символи Unicode:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Приклад з використанням багатьох символів Unicode
Ось приклад, який намагається зіставити кожен можливий символ до трьох біт шириною (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
На ньому буде відображено шістнадцяткове відображення, категорія , символ (якщо не вдасться отримати ім’я, тому, можливо, контрольний символ), а також назву символу. напр
Я рекомендую 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-х буде.