Préface: votre spectateur fonctionnera-t-il?
Assurez-vous que votre visionneuse / éditeur / terminal (quelle que soit la manière dont vous interagissez avec votre fichier encodé utf-8) peut lire le fichier. Il s'agit souvent d'un problème sous Windows , par exemple, le Bloc-notes.
Écrire du texte Unicode dans un fichier texte?
En Python 2, utilisez à open
partir du io
module (c'est le même que celui intégré open
dans Python 3):
import io
Meilleure pratique, en général, utilisée UTF-8
pour écrire dans des fichiers (nous n'avons même pas à nous soucier de l'ordre des octets avec utf-8).
encoding = 'utf-8'
utf-8 est l'encodage le plus moderne et universellement utilisable - il fonctionne dans tous les navigateurs Web, la plupart des éditeurs de texte (voir vos paramètres si vous avez des problèmes) et la plupart des terminaux / shells.
Sous Windows, vous pouvez essayer utf-16le
si vous êtes limité à l'affichage de la sortie dans le Bloc-notes (ou une autre visionneuse limitée).
encoding = 'utf-16le' # sorry, Windows users... :(
Et ouvrez-le avec le gestionnaire de contexte et écrivez vos caractères unicode:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Exemple utilisant de nombreux caractères Unicode
Voici un exemple qui tente de mapper tous les caractères possibles jusqu'à trois bits de large (4 est le maximum, mais cela irait un peu loin) de la représentation numérique (en nombres entiers) à une sortie imprimable codée, ainsi que son nom, si possible (mettez ceci dans un fichier appelé 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))
Cela devrait s'exécuter dans l'ordre d'une minute environ, et vous pouvez afficher le fichier de données, et si votre visionneuse de fichiers peut afficher unicode, vous le verrez. Informations sur les catégories peuvent être trouvées ici . Sur la base des décomptes, nous pouvons probablement améliorer nos résultats en excluant les catégories Cn et Co, auxquelles aucun symbole ne leur est associé.
$ python uni.py
Il affichera le mappage hexadécimal, la catégorie , le symbole (à moins qu'il ne puisse pas obtenir le nom, donc probablement un caractère de contrôle), et le nom du symbole. par exemple
Je recommande less
sur Unix ou Cygwin (n'imprimez pas / ne cattez pas le fichier entier à votre sortie):
$ less unidata
par exemple, affichera similaire aux lignes suivantes que j'ai échantillonnées à partir de celui-ci en utilisant 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
Mon Python 3.5 d'Anaconda a unicode 8.0, je suppose que la plupart des 3 le feraient.