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.

questionAnswers(1)

yourAnswerToTheQuestion