Prefácio: seu visualizador funcionará?
Verifique se o visualizador / editor / terminal (no entanto, você está interagindo com o arquivo codificado utf-8) pode lê-lo. Isso costuma ser um problema no Windows , por exemplo, o Bloco de Notas.
Escrever texto Unicode em um arquivo de texto?
No Python 2, use a open
partir do io
módulo (é o mesmo que o embutido open
no Python 3):
import io
As práticas recomendadas, em geral, são usadas UTF-8
para gravar arquivos (nem precisamos nos preocupar com a ordem de bytes com utf-8).
encoding = 'utf-8'
O utf-8 é a codificação mais moderna e universalmente utilizável - funciona em todos os navegadores da web, na maioria dos editores de texto (veja suas configurações se houver problemas) e na maioria dos terminais / shells.
No Windows, você pode tentar utf-16le
se estiver limitado à exibição da saída no Bloco de notas (ou em outro visualizador limitado).
encoding = 'utf-16le' # sorry, Windows users... :(
E basta abri-lo com o gerenciador de contexto e escrever seus caracteres unicode:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Exemplo usando muitos caracteres Unicode
Aqui está um exemplo que tenta mapear todos os caracteres possíveis com até três bits de largura (4 é o máximo, mas isso seria um pouco distante) da representação digital (em números inteiros) para uma saída imprimível codificada, juntamente com seu nome, se possível (coloque isso em um arquivo chamado 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))
Isso deve ser executado na ordem de cerca de um minuto, e você pode visualizar o arquivo de dados e, se o visualizador de arquivos puder exibir unicode, você o verá. Informações sobre as categorias podem ser encontradas aqui . Com base nas contagens, provavelmente podemos melhorar nossos resultados excluindo as categorias Cn e Co, que não possuem símbolos associados a elas.
$ python uni.py
Ele exibirá o mapeamento hexadecimal, categoria , símbolo (a menos que não consiga obter o nome, provavelmente um caractere de controle) e o nome do símbolo. por exemplo
Eu recomendo less
no Unix ou Cygwin (não imprima / copie o arquivo inteiro para sua saída):
$ less unidata
por exemplo, exibirá semelhante às seguintes linhas que eu amostramos 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
Meu Python 3.5 do Anaconda tem unicode 8.0, eu presumo que a maioria dos 3 teria.