Przedmowa: czy Twój widz będzie działał?
Upewnij się, że twoja przeglądarka / edytor / terminal (jakkolwiek wchodzisz w interakcję z plikiem zakodowanym w utf-8) może go odczytać. Jest to często problem w systemie Windows , na przykład w Notatniku.
Zapisujesz tekst Unicode do pliku tekstowego?
W Python 2 użyj open
z io
modułu (jest to to samo, co wbudowane open
w Python 3):
import io
Najlepsze praktyki, ogólnie rzecz biorąc, używaj UTF-8
do zapisywania do plików (nie musimy nawet martwić się kolejnością bajtów z utf-8).
encoding = 'utf-8'
utf-8 jest najnowocześniejszym i powszechnie używanym kodowaniem - działa we wszystkich przeglądarkach internetowych, w większości edytorów tekstu (sprawdź ustawienia, jeśli masz problemy) i na większości terminali / powłok.
W systemie Windows możesz spróbować, utf-16le
jeśli jesteś ograniczony do wyświetlania wyników w Notatniku (lub innej ograniczonej przeglądarce).
encoding = 'utf-16le' # sorry, Windows users... :(
I po prostu otwórz go za pomocą menedżera kontekstu i wypisz swoje znaki Unicode:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Przykład użycia wielu znaków Unicode
Oto przykład, który próbuje zmapować każdy możliwy znak o szerokości do trzech bitów (4 to maksimum, ale byłoby to nieco daleko) od cyfrowej reprezentacji (w liczbach całkowitych) do zakodowanego wydruku, wraz z jego nazwą, jeśli możliwe (wstaw to do pliku o nazwie 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))
Powinno to działać w kolejności około minuty i można wyświetlić plik danych, a jeśli przeglądarka plików może wyświetlać Unicode, zobaczysz go. Informacje o kategoriach można znaleźć tutaj . Na podstawie obliczeń możemy prawdopodobnie poprawić nasze wyniki, wykluczając kategorie Cn i Co, które nie mają z nimi żadnych symboli.
$ python uni.py
Wyświetli odwzorowanie szesnastkowe, kategorię , symbol (chyba że nie można uzyskać nazwy, więc prawdopodobnie znak kontrolny) i nazwę symbolu. na przykład
Polecam less
na Unixie lub Cygwinie (nie drukuj / cat całego pliku na wyjście):
$ less unidata
np. wyświetli podobne do następujących wierszy, z których próbkowałem z niego przy użyciu Pythona 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
Mój Python 3.5 z Anacondy ma Unicode 8.0, przypuszczam, że większość 3.