Problema de conversão de Unicode usando Python no Emacs
Eu estou tentando entender a diferença em um pouco de comportamento de script Python quando executado na linha de comando vs executar como parte de uma função elisp do Emacs.
O script é assim (estou usando o Python 2.7.1 BTW):
import json; t = {"Foo":"ザ"}; print json.dumps(t).decode("unicode_escape")
ou seja, [em geral] pegue um segmento JSON contendo caracteres unicode, dumpstring para sua versão unicode escapada, então decodifique-a de volta para sua representação unicode. Quando executado na linha de comando, a parte de dumps deste retorna:
'{"Foo": "\\u30b6"}'
que quando impressa se parece com:
'{"Foo": "\u30b6"}'
a parte de decodificação disso se parece com:
u'{"Foo": "\u30b6"}'
que quando impressa se parece com:
{"Foo": "ザ"}
isto é, a representação de string original da estrutura, pelo menos em um terminal / console que suporta unicode (no meu testbed, um xterm). Em um console do Windows, a saída não está correta com relação ao caractere unicode, mas o script não comete erros.
No Emacs, a conversão de dumps é a mesma que na linha de comando (pelo menos no que diz respeito a confirmar com uma impressão), mas a parte de decodificação sai com o temido:
Arquivo "", linha 1, em UnicodeEncodeError: o codec 'ascii' não pode codificar o caractere u '\ u30b6' na posição 9: ordinal não no intervalo (128) `
Eu sinto que estou sentindo falta de algo básico aqui em relação ao script ou ao Emacs (no meu testbed 23.1.1). Existe alguma parte auto-mágica de impressão invocando o codec / locale correto que acontece na linha de comando, mas não no Emacs? Eu tentei definir explicitamente a localidade para uma invocação do Emacs (aqui está um teste stub sem a lógica json):
"LC_ALL=\"en_US.UTF-8\" python -c 's = u\"Fooザ\"; print s'"
produz a mesma exceção, enquanto
"LC_ALL=\"en_US.UTF-8\" python -c 'import sys; enc=sys.stdout.encoding; print enc' "
indica que a codificação é 'Nenhum'.
Se eu tentar coagir a conversão usando:
"LC_ALL=\"en_US.UTF-8\" python -c 's = u\"Fooザ\"; print s.encode(\"utf8\",\"replace\")'"
o erro desaparece, mas o resultado é a versão "ilegível" da string vista no console não-unicode:
Fooa?¶
Alguma ideia?
ATUALIZAÇÃO: graças aunutbu - b / c a identificação do código do idioma cai, o comando precisa ser explicitamente decorado com a codificação utf8 (veja a resposta para trabalhar diretamente com uma cadeia unicode). No meu caso, estou recebendo o que é necessário dodumps/decode
seqüência, então eu adiciono a decoração necessária adicional para alcançar o resultado desejado:
import json; t = {"Foo":"ザ"}; print json.dumps(t).decode("unicode_escape").encode("utf8","replace")
Note que este é o Python "bruto" sem o necessário escape necessário pelo Emacs.
Como você deve ter adivinhado ao analisar a parte original desta questão, estou usando isso como parte de alguma lógica de formatação JSON no Emacs - consulteminha resposta paraessa questão.