Vorwort: Funktioniert Ihr Viewer?
Stellen Sie sicher, dass Ihr Viewer / Editor / Terminal (wie auch immer Sie mit Ihrer utf-8-codierten Datei interagieren) die Datei lesen kann. Dies ist häufig ein Problem unter Windows , z. B. Notepad.
Unicode-Text in eine Textdatei schreiben?
Verwenden Sie in Python 2 open
das io
Modul (dies entspricht dem open
in Python 3 integrierten):
import io
Best Practice wird im Allgemeinen UTF-8
zum Schreiben in Dateien verwendet (wir müssen uns mit utf-8 nicht einmal um die Bytereihenfolge kümmern).
encoding = 'utf-8'
utf-8 ist die modernste und universell verwendbare Codierung - es funktioniert in allen Webbrowsern, den meisten Texteditoren (siehe Ihre Einstellungen, wenn Sie Probleme haben) und den meisten Terminals / Shells.
Unter Windows können Sie versuchen utf-16le
, die Ausgabe nur im Editor (oder einem anderen eingeschränkten Viewer) anzuzeigen.
encoding = 'utf-16le' # sorry, Windows users... :(
Öffnen Sie es einfach mit dem Kontextmanager und schreiben Sie Ihre Unicode-Zeichen auf:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Beispiel mit vielen Unicode-Zeichen
Hier ist ein Beispiel, das versucht, jedes mögliche Zeichen mit einer Breite von bis zu drei Bit (4 ist das Maximum, aber das würde ein bisschen weit gehen) von der digitalen Darstellung (in ganzen Zahlen) zusammen mit seinem Namen auf eine codierte druckbare Ausgabe abzubilden, wenn möglich (in eine Datei mit dem Namen 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))
Dies sollte in der Größenordnung von ungefähr einer Minute ausgeführt werden, und Sie können die Datendatei anzeigen. Wenn Ihr Datei-Viewer Unicode anzeigen kann, wird dies angezeigt. Informationen zu den Kategorien finden Sie hier . Basierend auf den Zählungen können wir unsere Ergebnisse wahrscheinlich verbessern, indem wir die Kategorien Cn und Co ausschließen, denen keine Symbole zugeordnet sind.
$ python uni.py
Es wird die hexadezimale Zuordnung Kategorie angezeigt , das Symbol (es sei denn, der Name kann nicht abgerufen werden, also wahrscheinlich ein Steuerzeichen) und der Name des Symbols . z.B
Ich empfehle less
unter Unix oder Cygwin (drucke / cat nicht die gesamte Datei für deine Ausgabe):
$ less unidata
zB wird ähnlich wie in den folgenden Zeilen angezeigt, die ich mit Python 2 (Unicode 5.2) daraus abgetastet habe:
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
Mein Python 3.5 von Anaconda hat Unicode 8.0, ich würde davon ausgehen, dass die meisten 3er dies tun würden.