Pergunta

Eu tenho alguns json eu preciso decodificar, alterar e, em seguida, codificar sem prejudicar quaisquer caracteres.

Se eu tiver um caractere unicode em uma string json não vai decodificar.Eu não sou certo porque desde json.org diz uma seqüência de caracteres pode conter: any-Unicode-character- except-"-or-\-or- control-character.Mas ele não funciona em python.

{"Tag":"Odómetro"}

Eu posso usar utf8_encode que vai permitir que a seqüência de caracteres a ser decodificado com json_decode, no entanto, o personagem fica desconfigurado em outra coisa.Este é o resultado de um print_r da matriz de resultado.Dois personagens.

[Tag] => Odómetro

Quando eu codificar novamente a matriz I o personagem escapou para ascii, o que é correto de acordo com o json spec:

"Tag"=>"Od\u00f3metro"

Existe alguma maneira eu posso onu-escapar desta?json_encode dá nenhuma opção, utf8_encode não parece funcionar.

Editar Vejo que há uma unescaped_unicode opção para json_encode.No entanto, ele não está funcionando como esperado.Oh, porra, é só no php 5.4.Vou ter que usar algum regex como eu só tenho 5.3.

$json = json_encode($array, JSON_UNESCAPED_UNICODE);
Warning: json_encode() expects parameter 2 to be long, string ...
Foi útil?

Solução

A julgar por tudo o que você disse, parece que o original Odómetro seqüência de caracteres que você está lidando é codificado com a norma ISO 8859-1, não UTF-8.

Aqui está por que eu penso assim:

  • json_encode produzido analisáveis de saída depois que você executou a seqüência de caracteres de entrada através de utf8_encode, que converte a partir de ISO 8859-1 para UTF-8.
  • Você disse que você tem "deturpados" saída quando utilizar print_r depois de fazer utf8_encode, mas deturpados de saída que você tem, na verdade, é exatamente o que iria acontecer, tentando analisar de texto UTF-8 como o ISO 8859-1 (ó é \x63\xb3 em UTF-8, mas essa sequência é ó na norma ISO 8859-1.
  • O seu htmlentities hackaround solução funcionou. htmlentities precisa saber o que a codificação da seqüência de caracteres de entrada para funcionar corretamente.Se você não especificar um, assume-ISO 8859-1.(html_entity_decode, confusamente, o padrão é UTF-8, assim, o seu método teve o efeito de conversão de ISO 8859-1 para UTF-8.)
  • Você disse que tinha o mesmo problema em Python, o que parece excluir o PHP está sendo o problema.

O PHP irá utilizar o \uXXXX escapar, mas como você observou, esta é válido JSON.

Assim, parece que você precisa para configurar sua conexão com o Postgres, de modo que ele irá dar a você UTF-8 cordas.O PHP manual indica que você deseja fazer este acrescentando options='--client_encoding=UTF8' para a seqüência de caracteres de conexão.Há também a possibilidade de que os dados armazenados no banco de dados na codificação errada.(Você poderia simplesmente usar utf8_encode, mas isto só suporte de caracteres que fazem parte da ISO 8859-1).

Finalmente, como outra resposta anotado, você precisa certificar-se de que você está declarando o bom charset, com um cabeçalho HTTP ou de outra forma (claro, esse problema pode ter sido apenas um artefato do ambiente onde você fez a sua print_r os testes).

Outras dicas

Encontrei a seguinte maneira de corrigir esse problema ... Espero que isso possa ajudá-lo.

json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);

JSON_UNESCAPED_UNICODE foi adicionado no PHP 5.4 então parece que você precisa atualizar sua versão do PHP para tirar vantagem disso.5.4 ainda não foi lançado!:(

Há um candidato a lançamento alfa 5.4 no controle de qualidade, se você quiser jogar em sua máquina de desenvolvimento.

Uma maneira hacky de fazer JSON_UNESCAPED_UNICODE no PHP 5.3.Realmente desapontado com o suporte a PHP json.Talvez isso ajude outra pessoa.

$array = some_json();
// Encode all string children in the array to html entities.
array_walk_recursive($array, function(&$item, $key) {
    if(is_string($item)) {
        $item = htmlentities($item);
    }
});
$json = json_encode($array);

// Decode the html entities and end up with unicode again.
$json = html_entity_decode($rson);

tente definir a codificação utf-8 em sua página:

header('content-type:text/html;charset=utf-8');

isso funciona para mim:

$arr = array('tag' => 'Odómetro');
$encoded = json_encode($arr);
$decoded = json_decode($encoded);
echo $decoded->{'tag'};
$json = array('tag' => 'Odómetro'); // Original array
$json = json_encode($json); // {"Tag":"Od\u00f3metro"}
$json = json_decode($json); // Od\u00f3metro becomes  Odómetro
echo $json->{'tag'}; // Odómetro
echo utf8_decode($json->{'tag'}); // Odómetro

Você chegou perto, basta usar utf8_decode.

Tente usar:

utf8_decode() and utf8_encode

Para codificar uma matriz que contém caracteres especiais, ISO 8859-1 a UTF8.(Se utf8_encode & utf8_decode não é o que está funcionando para você, isso pode ser uma opção)

Tudo que está em ISO-8859-1 deve ser convertido para UTF8:

$utf8 = utf8_encode('이 감사의 마음을 전합니다!'); //contains UTF8 & ISO 8859-1 characters;    
$iso88591 = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8');
$data = $iso88591;

A codificação deve funcionar depois disso:

$encoded_data = json_encode($data);

Converter UTF-8 para e de ISO 8859-1

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top