Estou escrevendo um serviço da web que usa json para representar seus recursos e estou um pouco preso a pensar sobre a melhor maneira de codificar o json. Lendo o json rfc ( http://www.ietf.org/rfc/rfc4627.txt ), fica claro que a codificação preferida é utf-8. Mas o rfc também descreve um mecanismo de escape de string para especificar caracteres. Suponho que isso geralmente seria usado para escapar caracteres não-ascii, tornando o utf-8 ascii válido.
Então, digamos que eu tenha uma string json que contém caracteres Unicode (pontos de código) que não são ASCII. O meu serviço da web deve apenas codificar em utf-8 e retorná-lo ou deve escapar de todos os caracteres não ASCII e retornar ASCII puro?
Eu gostaria que os navegadores pudessem executar os resultados usando jsonp ou eval. Isso afeta a decisão? Meu conhecimento de suporte a javascript de vários navegadores para utf-8 é insuficiente.
EDIT: Eu queria esclarecer que minha principal preocupação sobre como codificar os resultados é realmente sobre como o navegador manipula os resultados. O que li indica que os navegadores podem ser sensíveis à codificação ao usar JSONP em particular. Não encontrei nenhuma informação realmente boa sobre o assunto, então terei que começar a fazer alguns testes para ver o que acontece. Idealmente, gostaria de apenas escapar aqueles poucos caracteres que são necessários e apenas utf-8 codificar os resultados.
fonte
Tive um problema aí. Quando eu codifico JSON uma string com um caractere como "é", todos os navegadores retornarão o mesmo "é", exceto o IE que retornará "\ u00e9".
Então, com PHP json_decode (), ele falhará se encontrar "é", então para Firefox, Opera, Safari e Chrome, tenho que chamar utf8_encode () antes de json_decode ().
Nota: com meus testes, o IE e o Firefox estão usando seu objeto JSON nativo, outros navegadores estão usando json2.js.
fonte
utf8_encode()
, php.net/manual/en/function.utf8-encode.phpASCII não está mais nele. Usar a codificação UTF-8 significa que você não está usando a codificação ASCII. Você deve usar o mecanismo de escape para o que diz o RFC:
fonte
Eu estava enfrentando o mesmo problema. Funciona para mim. Por favor, checar isto.
json_encode($array,JSON_UNESCAPED_UNICODE);
fonte
FYI, RFC 4627 não é mais a especificação JSON oficial. Ele ficou obsoleto em 2014 pela RFC 7159 , que foi então obsoleto em 2017 pela RFC 8259 , que é a especificação atual.
RFC 8259 afirma:
fonte
Tive um problema parecido com é char ... Acho que o comentário "é possível que o texto que você está alimentando não seja UTF-8" provavelmente esteja perto da marca aqui. Tenho a sensação de que o agrupamento padrão em minha instância era outra coisa até que percebi e mudei para utf8 ... o problema é que os dados já estavam lá, então não tenho certeza se converteu os dados ou não quando eu os alterei, exibe bem no mysql bancada de trabalho. O resultado final é que o php não codificará os dados em JSON, apenas retornará falso. Não importa qual navegador você usa como servidor que está causando meu problema, o php não analisará os dados para utf8 se este char estiver presente. Como eu disse, não tenho certeza se é devido à conversão do esquema para utf8 depois que os dados estavam presentes ou apenas um bug de php. Neste caso, use
json_encode(utf8_encode($string));
fonte