Problema com retorno acentos JSON + Rest + DataSnap

11/10/2017

0

Boa tarde pessoal, estou com problema para retorno de caracteres especiais, fazendo uso datasnap + rest no delphi retornando em JSON, por exemplo.

http://localhost:8098/datasnap/rest/TControllerServico/EchoString/Caçador

Ele me retorna ao consumir um JSON:
{"result":["Ca\\u00E7ador"]}

No rest debuger ele exibe corretamente

{
"result":
[
"Caçador"
]
}

Sou novato no uso desta, existe alguma forma de eu retornar já no formato de acentuação ansi?
Desculpe derrepente haver outro tópico ser semelhante a outros mas não encontrei. Ficarei muito grato se puderem me dar um help.
Anderson Amaral

Anderson Amaral

Responder

Posts

13/10/2017

Ermesom Lourenco

Não uso propriamente o DataSnap, mas quando fui fazer algo semelhante com Indy tive o mesmo problema. Acontece que cada quebra de linha ou batulações no Delphi são identificadas com caracteres especiais, de modo que ao transmitir o JSON dá alguns erros no navegador. Para isso resolvi da seguinte forma:

retorno.mensagem := StringReplace(retorno.mensagem, #$D#$A, '\\n', [rfReplaceAll, rfIgnoreCase]);

Ou seja, mapeando cada um deles.
Outro problema é este que está citando, que é o de acentos e ç, neste caso bastou converter tudo para utf-8 que resolveu:

Resposta.CharSet := 'utf-8';

Espero ter ajudado.
Responder

13/10/2017

Anderson Amaral

Boa tarde Ermesoml, com certeza ajuda sempre, qualquer comentário inerente ao assunto, situações de possível solução, mesmo que não seja identico a solução nos ajuda a ver as vezes também sob outros ângulos o problema.
Com base no que comentaste pelo que verifiquei me parece que a codificação que ele faz exemplo: \\u00c7 corresponde ao charset UTF-7 de acordo com a w3.org, pelo que interpretei, conforme link abaixo:
https://www.w3.org/People/danield/unic/unitra.htm

Desta forma identifiquei no meu DSHTTPService - o evento: ONHTTPTrace, e nele incluí uma conversão manual no braço com stringreplace que sugeriu trocando cada letra por exemplo \\u00c7 para Ç e assim por diante, que aparentemente resolveu meu problema. Contudo, apenas trocando o CharSet no mesmo evento, com uso de:
AResponse.ContentType:= 'application/json; charset=utf-32' não resolveu.

Daqui a pouco pode ser em outro evento ou propriedade que tenha que interagir que pela minha pouca experiência neste contexto desconheça. Se alguem tiver uma sugestão melhor também ficarei muito grato pela contribuição e será sempre bem vinda.

De qualquer forma, meu problema aparentemente resolvido meu problema Ermesoml, muitíssimo obrigado pela tua contribuição, abraços!
Responder

13/10/2017

Anderson Amaral

Boa tarde Ermesoml, com certeza ajuda sempre, qualquer comentário inerente ao assunto, situações de possível solução, mesmo que não seja identico a solução nos ajuda a ver as vezes também sob outros ângulos o problema.
Com base no que comentaste pelo que verifiquei me parece que a codificação que ele faz exemplo: \\\\\\\\u00c7 corresponde ao charset UTF-7 de acordo com a w3.org, pelo que interpretei, conforme link abaixo:
https://www.w3.org/People/danield/unic/unitra.htm

Desta forma identifiquei no meu DSHTTPService - o evento: ONHTTPTrace, e nele incluí uma conversão manual no braço com stringreplace que sugeriu trocando cada letra por exemplo \\\\\\\\u00c7 para Ç e assim por diante, que aparentemente resolveu meu problema. Contudo, apenas trocando o CharSet no mesmo evento, com uso de:
AResponse.ContentType:= ''application/json; charset=utf-8'' não resolveu.

Daqui a pouco pode ser em outro evento ou propriedade que tenha que interagir que pela minha pouca experiência neste contexto desconheça. Se alguem tiver uma sugestão melhor também ficarei muito grato pela contribuição e será sempre bem vinda.

De qualquer forma, meu problema aparentemente resolvido meu problema Ermesoml, muitíssimo obrigado pela tua contribuição, abraços!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar