Como imprimir caracteres Unicode em Python?


115

Quero fazer um dicionário onde palavras em inglês apontem para traduções em russo e francês.

Como faço para imprimir caracteres Unicode em Python? Além disso, como você armazena caracteres Unicode em uma variável?



Dê uma olhada aqui . Prefixar suas strings com upermite que o python as considere como strings literais Unicode.
SRI

Respostas:


109

Para incluir caracteres Unicode em seu código-fonte Python, você pode usar caracteres de escape Unicode na forma \u0123de sua string e prefixar a string literal com 'u'.

Aqui está um exemplo em execução no console interativo Python:

>>> print u'\u0420\u043e\u0441\u0441\u0438\u044f'
Россия

Strings declaradas assim são variáveis ​​do tipo Unicode, conforme descrito na documentação do Python Unicode .

Se a execução do comando acima não exibir o texto corretamente para você, talvez seu terminal não seja capaz de exibir caracteres Unicode.

Para obter informações sobre como ler dados Unicode de um arquivo, consulte esta resposta:

Leitura de caracteres de arquivo em Python


4
Sim, você pode escrever seu código em arquivos de texto codificados em Unicode, mas muitos editores e ferramentas têm problemas para lidar com eles. Minha experiência com o trabalho com código-fonte em várias plataformas diferentes é que é melhor manter o código-fonte em ASCII e usar escapes Unicode.
Matt Ryall

3
@MattRyall, eu concordo, mas uma equipe de desenvolvedores russos pode querer escrever comentários e docstrings em russo. Para um projeto de linguagem é uma boa opção.
Johan Lundberg

3
No entanto, observe que isso só funciona se você imprimir apenas a string. Se estiver envolto em algum outro objeto, você verá códigos de escape. Tente "imprimir [u '\ u0420 \ u043e \ u0441 \ u0441 \ u0438 \ u044f']" por exemplo.
btubbs

3
E se eu o armazenasse em uma string mystr? então como imprimir isso?
cqcn1991

1
@CarloWood A melhor resposta diz exatamente o que você deseja. Justprint your_unicode_characters.encode('utf-8')
Yuhao Zhang

48

Imprima um caractere Unicode em Python:

Imprima um caractere Unicode diretamente do interpretador Python:

el@apollo:~$ python
Python 2.7.3
>>> print u'\u2713'

O caractere Unicode u'\u2713'é uma marca de seleção. O intérprete imprime a marca de seleção na tela.

Imprima um caractere Unicode de um script Python:

Coloque isso em test.py:

#!/usr/bin/python
print("here is your checkmark: " + u'\u2713');

Execute assim:

el@apollo:~$ python test.py
here is your checkmark: 

Se não houver uma marca de seleção para você, o problema pode estar em outro lugar, como as configurações do terminal ou algo que você está fazendo com o redirecionamento de fluxo.

Armazene caracteres Unicode em um arquivo:

Salve no arquivo: foo.py:

#!/usr/bin/python -tt
# -*- coding: utf-8 -*-
import codecs
import sys 
UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)
print(u'e with obfuscation: é')

Execute-o e canalize a saída para o arquivo:

python foo.py > tmp.txt

Abra tmp.txt e olhe dentro, você verá isto:

el@apollo:~$ cat tmp.txt 
e with obfuscation: é

Assim, você salvou em um arquivo o Unicode e com uma marca de ofuscação.


@ ofer.sheffer bizarramente estou aqui procurando resolver o problema oposto, a questão é que pode demorar um pouco.
Chris H

40

Se você está tentando print()Unicode e recebendo erros de codec ascii , verifique esta página , cujo TLDR é feito export PYTHONIOENCODING=UTF-8antes de iniciar o python (esta variável controla a sequência de bytes que o console tenta codificar seus dados de string). Internamente, Python3 usa UTF-8 por padrão (veja o Unicode HOWTO), então esse não é o problema; você pode simplesmente colocar Unicode em strings, como visto nas outras respostas e comentários. É quando você tenta obter esses dados para o console que o problema acontece. Python acha que seu console só pode lidar com ascii. Algumas das outras respostas dizem: "Grave em um arquivo primeiro", mas observe que eles especificam a codificação (UTF-8) para fazer isso (portanto, o Python não muda nada na escrita) e, em seguida, usa um método para leitura o arquivo que apenas cospe os bytes sem nenhuma preocupação com a codificação, e é por isso que funciona.


Obrigado! Tive um problema unicde ao usar o pacote asciitree para gravar resultados em um arquivo. Isso resolveu para mim.
Pål Thingbø

Muito obrigado. Passei horas pesquisando, feliz por ter encontrado isso.
CharlyDelta

17

No Python 2, você declara strings Unicode com a u, as in u"猫"e usa decode()e encode()para traduzir de e para Unicode, respectivamente.

É um pouco mais fácil no Python 3. Uma ótima visão geral pode ser encontrada aqui . Essa apresentação esclareceu muitas coisas para mim.


1
Obrigado pelo link de vídeo. É muito útil.
arun

1
Também está disponível como um não-vídeo aqui: Unicode pragmático ou, Como faço para parar a dor? (Pycon2012) nedbatchelder.com/text/unipain.html
Tom Hundt

7

Considerando que este é o primeiro resultado de estouro de pilha ao pesquisar este tópico no Google, vale a pena mencionar que o prefixo u strings Unicode é opcional no Python 3. (o exemplo do Python 2 foi copiado da resposta principal)

Python 3 (ambos funcionam):

print('\u0420\u043e\u0441\u0441\u0438\u044f')
print(u'\u0420\u043e\u0441\u0441\u0438\u044f')

Python 2:

print u'\u0420\u043e\u0441\u0441\u0438\u044f'

Obrigado! Exatamente o que eu procurei: uma maneira universal de imprimir um caractere Unicode dentro de uma string para python2 e python3.
JenyaKh

a versão com grampo também deve funcionar no Phyton 2 - grampos são uma opção e, portanto, são permitidos.
Alexander Stohr

4

Eu uso o Winpython portátil no Windows, ele inclui o console IPython QT, eu poderia conseguir o seguinte.

>>>print ("結婚")
結婚

>>>print ("おはよう")
おはよう

>>>str = "結婚"


>>>print (str)
結婚

seu interpretador de console deve suportar Unicode para mostrar caracteres Unicode.


3

Só mais uma coisa que ainda não foi adicionada

No Python 2, se você quiser imprimir uma variável que tenha unicode e use .format(), faça isso (faça da string base que está sendo formatada uma string Unicode com u'':

>>> text = "Université de Montréal"
>>> print(u"This is unicode: {}".format(text))
>>> This is unicode: Université de Montréal

3

Isso corrige a impressão UTF-8 em python:

UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)

1

Substitua '+' por '000' . Por exemplo, 'U + 1F600' se tornará 'U0001F600' e incluirá "\" no prefixo do código Unicode e imprimirá. Exemplo:

>>> print("Learning : ", "\U0001F40D")
Learning :  🐍
>>> 

Verifique isso talvez ajude python emoji Unicode

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.