Código de amostra:
>>> import json
>>> json_string = json.dumps("ברי צקלה")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
O problema: não é legível por humanos. Meus usuários (inteligentes) desejam verificar ou editar arquivos de texto com despejos JSON (e prefiro não usar XML).
Existe uma maneira de serializar objetos em cadeias UTF-8 JSON (em vez de \uXXXX
)?
Respostas:
Use a
ensure_ascii=False
opção parajson.dumps()
, em seguida, codifique o valor para UTF-8 manualmente:Se você estiver gravando em um arquivo, basta usar
json.dump()
e deixar o objeto de arquivo para codificar:Advertências para Python 2
Para o Python 2, há mais algumas ressalvas a serem consideradas. Se você estiver gravando isso em um arquivo, poderá usar em
io.open()
vez deopen()
produzir um objeto de arquivo que codifique valores Unicode para você enquanto escreve, e usejson.dump()
para gravar nesse arquivo:Note que há um bug no
json
módulo onde aensure_ascii=False
bandeira pode produzir uma mistura deunicode
estr
objetos. A solução alternativa para o Python 2 é:No Python 2, ao usar cadeias de bytes (tipo
str
), codificadas em UTF-8, certifique-se de definir também aencoding
palavra-chave:fonte
Para gravar em um arquivo
Para imprimir em stdout
fonte
codecs
biblioteca. Obrigado!ATUALIZAÇÃO: Esta é uma resposta errada, mas ainda é útil entender por que está errada. Ver comentários.
Que tal
unicode-escape
?fonte
unicode-escape
não é necessário: você pode usarjson.dumps(d, ensure_ascii=False).encode('utf8')
. E não é garantido que o json use exatamente as mesmas regras dounicode-escape
codec no Python em todos os casos, ou seja, o resultado poderá ou não ser o mesmo em alguns casos de canto. O voto negativo é para uma conversão desnecessária e possivelmente incorreta. Não relacionado:print json_str
funciona apenas para localidades utf8 ou sePYTHONIOENCODING
envvar especifica utf8 aqui (em vez disso, imprima Unicode).json.dumps(d, ensure_ascii=False).encode('utf8')
não está funcionando, pelo menos para mim. Estou recebendoUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position ...
-error. Aunicode-escape
variante funciona bem no entanto.Solução alternativa do python 2 de Peters falha em um caso de borda:
Ele estava travando na parte .decode ('utf8') da linha 3. Corrigi o problema, tornando o programa muito mais simples, evitando essa etapa e a cobertura especial do ascii:
fonte
unicode(data)
abordagem é a melhor opção, em vez de usar o tratamento de exceções. Observe que oencoding='utf8'
argumento da palavra - chave não tem nada a ver com a saída quejson.dumps()
produz; é usado para decodificar astr
entrada que a função recebe.open('filename', 'wb').write(json.dumps(d, ensure_ascii=False).encode('utf8'))
funciona sedumps
retorna objeto str ou unicode (somente ASCII).str.encode('utf8')
decodifica implicitamente primeiro. Mas o mesmo aconteceunicode(data)
, se for dado umstr
objeto. :-) Noio.open()
entanto, o uso oferece mais opções, incluindo o uso de um codec que grava uma BOM e você segue os dados JSON com outra coisa..encode('utf8')
variante baseada em funciona em Python 2 e 3 (o mesmo código). Não existeunicode
no Python 3. Não relacionado: os arquivos json não devem usar a BOM (embora um analisador json de confirmação possa ignorar a BOM, consulte a página 3983 incorreta ).encoding='utf8'
parajson.dumps
resolver o problema. PS Eu tenho um texto cirílico para despejarNo Python 3.7, o código a seguir funciona bem:
Resultado:
fonte
A seguir, é minha compreensão var leitura resposta acima e google.
fonte
Aqui está a minha solução usando json.dump ():
em que SYSTEM_ENCODING está definido como:
fonte
Use codecs, se possível,
fonte
Obrigado pela resposta original aqui. No python 3, a seguinte linha de código:
foi tudo bem. Considere não escrever muito texto no código, se não for imperativo.
Isso pode ser bom o suficiente para o console python. No entanto, para satisfazer um servidor, pode ser necessário definir o código do idioma conforme explicado aqui (se estiver no apache2) http://blog.dscpl.com.au/2014/09/setting-lang-and-lcall-when-using .html
basicamente instale o he_IL ou qualquer idioma no ubuntu, verifique se não está instalado
instale-o onde XX é o seu idioma
Por exemplo:
adicione o seguinte texto em / etc / apache2 / envvrs
Espero que você não tenha erros de python no apache como:
Também no apache, tente fazer utf a codificação padrão, conforme explicado aqui:
Como alterar a codificação padrão para UTF-8 para Apache?
Faça isso cedo, porque os erros do apache podem ser difíceis de depurar e você pode erroneamente pensar que é do python, o que possivelmente não é o caso nessa situação
fonte
Se você estiver carregando a string JSON de um arquivo e conteúdo do arquivo, os textos em árabe. Então isso vai funcionar.
Suponha que o arquivo seja: arabic.json
Obter o conteúdo em árabe do arquivo arabic.json
Para usar dados JSON no modelo do Django, siga as etapas abaixo:
fonte
fh.close()
fh
está indefinido.f.close()
use unicode-escape para resolver o problema
explicar
recurso original: https://blog.csdn.net/chuatony/article/details/72628868
fonte
O uso de allow_ascii = False no json.dumps é a direção certa para resolver esse problema, conforme apontado por Martijn. No entanto, isso pode gerar uma exceção:
Você precisa de configurações extras em site.py ou sitecustomize.py para definir seu sys.getdefaultencoding () correto. site.py está em lib / python2.7 / e sitecustomize.py está em lib / python2.7 / site-packages.
Se você deseja usar site.py, em def setencoding (): altere o primeiro se 0: para se 1: para que o python use a localidade do sistema operacional.
Se você preferir usar sitecustomize.py, que pode não existir se você não o tiver criado. basta colocar estas linhas:
Em seguida, você pode fazer alguma saída json chinesa no formato utf-8, como:
Você obterá uma string codificada utf-8, em vez de \ ua string json de escape.
Para verificar sua codificação padrão:
Você deve obter "utf-8" ou "UTF-8" para verificar as configurações do site.py ou sitecustomize.py.
Observe que você não pode executar sys.setdefaultencoding ("utf-8") no console python interativo.
fonte
json
'sensure_ascii=False
. Forneça um exemplo de código completo mínimo, se você pensar o contrário.