Prefazione: il tuo spettatore funzionerà?
Assicurati che il tuo visualizzatore / editor / terminale (comunque tu stia interagendo con il tuo file codificato utf-8) possa leggere il file. Questo è spesso un problema su Windows , ad esempio Blocco note.
Scrivere testo Unicode in un file di testo?
In Python 2, usa open
dal io
modulo (questo è lo stesso del built- open
in in Python 3):
import io
Le migliori pratiche, in generale, usano UTF-8
per scrivere su file (non dobbiamo nemmeno preoccuparci di byte-order con utf-8).
encoding = 'utf-8'
utf-8 è la codifica più moderna e universalmente utilizzabile: funziona in tutti i browser Web, nella maggior parte degli editor di testo (vedere le impostazioni in caso di problemi) e nella maggior parte dei terminali / shell.
Su Windows, potresti provare utf-16le
se sei limitato a visualizzare l'output in Blocco note (o in un altro visualizzatore limitato).
encoding = 'utf-16le' # sorry, Windows users... :(
E basta aprirlo con il gestore di contesto e scrivere i caratteri unicode:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Esempio usando molti caratteri Unicode
Ecco un esempio che tenta di mappare ogni possibile carattere largo fino a tre bit (4 è il massimo, ma che andrebbe un po 'lontano) dalla rappresentazione digitale (in numeri interi) a un output stampabile codificato, insieme al suo nome, se possibile (inseriscilo in un file chiamato 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))
Dovrebbe essere eseguito nell'ordine di circa un minuto e puoi visualizzare il file di dati e se il tuo visualizzatore di file può visualizzare unicode, lo vedrai. Informazioni sulle categorie sono disponibili qui . Sulla base dei conteggi, possiamo probabilmente migliorare i nostri risultati escludendo le categorie Cn e Co, a cui non sono associati simboli.
$ python uni.py
Visualizzerà la mappatura esadecimale, la categoria , il simbolo (a meno che non sia possibile ottenere il nome, quindi probabilmente un carattere di controllo) e il nome del simbolo. per esempio
Raccomando less
su Unix o Cygwin (non stampare / cat l'intero file sul tuo output):
$ less unidata
ad esempio, verrà visualizzato in modo simile alle seguenti righe che ho campionato da esso usando 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
Il mio Python 3.5 di Anaconda ha Unicode 8.0, presumo che la maggior parte dei 3 lo farebbe.