Atualmente, estou usando um comando para converter alguns caracteres chineses em pinyin, o que exige que a string no meu bash seja segura para Unicode e coloque o resultado em outra variável. Eu posso executar o seguinte comando normalmente:
chinese="你好"
to-pinyin.py $chinese
Ele imprimirá a saída conforme o esperado, no entanto, como quero a saída em uma variável, tentei fazer o seguinte:
chinese="你好"
pinyin=$(to-pinyin.py $chinese)
E python falhará com:
Traceback (most recent call last):
File "/~/to-pinyin.py", line 31, in <module>
print pinyin.get(hanzi, delimiter=" ").capitalize()
UnicodeEncodeError: 'ascii' codec can't encode character u'\u01d0' in position 1: ordinal not in range(128)
A mesma coisa vai acontecer com backticks. Acho que vou contornar escrevendo a saída em um arquivo e em uma conversão lá, depois carregar as strings em uma variável. De que outra forma posso corrigir isso para evitar a solução alternativa?
EDITAR:
Por solicitação, aqui está a saída do locale:
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
SOLUÇÃO UTILIZADA
Graças à resposta de muru e alguma ajuda desta outra resposta , adicionei .encode('utf-8')
ao final das strings impressas no meu script python.
Eu gostaria de poder mudar para python3, mas não há nenhum pacote pinyin padrão e não consigo instalar nenhum bom pacote pinyin que faria meu trabalho rapidamente em python3. Lembro-me de tentar por um tempo, mas python3 continuou se recusando a importar o pacote que eu instalei, então instalei um em python2 e funcionou imediatamente.
Este é um problema com o Python 2
print
e uma razão para favorecer o manuseio consistente de Unicode do Python 3.