Prefacio: ¿funcionará su visor?
Asegúrese de que su visor / editor / terminal (sin embargo, está interactuando con su archivo codificado utf-8) pueda leer el archivo. Esto es frecuentemente un problema en Windows , por ejemplo, el Bloc de notas.
¿Escribir texto Unicode en un archivo de texto?
En Python 2, use open
desde el io
módulo (esto es lo mismo que el incorporado open
en Python 3):
import io
Las mejores prácticas, en general, se utilizan UTF-8
para escribir en archivos (ni siquiera tenemos que preocuparnos por el orden de bytes con utf-8).
encoding = 'utf-8'
utf-8 es la codificación más moderna y universalmente utilizable: funciona en todos los navegadores web, en la mayoría de los editores de texto (consulte su configuración si tiene problemas) y en la mayoría de los terminales / shells.
En Windows, puede intentarlo utf-16le
si está limitado a ver la salida en el Bloc de notas (u otro visor limitado).
encoding = 'utf-16le' # sorry, Windows users... :(
Y solo ábralo con el administrador de contexto y escriba sus caracteres Unicode:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Ejemplo usando muchos caracteres Unicode
Aquí hay un ejemplo que intenta asignar todos los caracteres posibles de hasta tres bits de ancho (4 es el máximo, pero eso iría un poco lejos) de la representación digital (en enteros) a una salida imprimible codificada, junto con su nombre, si posible (poner esto en un archivo llamado 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))
Esto debería ejecutarse en el orden de aproximadamente un minuto, y puede ver el archivo de datos, y si su visor de archivos puede mostrar unicode, lo verá. La información sobre las categorías se puede encontrar aquí . Según los recuentos, probablemente podamos mejorar nuestros resultados al excluir las categorías Cn y Co, que no tienen símbolos asociados.
$ python uni.py
Mostrará el mapeo hexadecimal, la categoría , el símbolo (a menos que no pueda obtener el nombre, por lo que probablemente sea un carácter de control) y el nombre del símbolo. p.ej
Recomiendo less
en Unix o Cygwin (no imprimir / cat el archivo completo a su salida):
$ less unidata
por ejemplo, se mostrará de manera similar a las siguientes líneas que probé 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
Mi Python 3.5 de Anaconda tiene unicode 8.0, supongo que la mayoría de los 3 lo harían.