Caracteres multibyte corrompidos para ????quando lido do banco de dados e postado na página ASP usando HTTPURLConnection
-
15-11-2019 - |
Pergunta
No meu código Java, estou recuperando alguns dados multibyte do banco de dados e criando alguns DOM xml, com esses dados como o valor de algum nó, convertendo o DOM em String e postando bytest na página ASP via HTTPURLConnection, mas de alguma forma no receptor finaliza os dados está aparecendo como ????em vez de alguns valores multibyte. Por favor, sugira o que fazer.
Coisas que já estou fazendo..
1) Eu configurei -Dfile.encoding =UTF8
como propriedade do sistema 2) enquanto usa TransformerFactory
para converter meu XML DOM para String , eu configurei
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8")
para ter certeza de que a codificação está correta ali.Por favor, sugira onde estou errando.
@Jon Skeet Mais algumas coisas para adicionar aqui ...1) Estou obtendo dados do banco de dados corretamente 2) O XML transformado também parece estar correto, conforme verifiquei salvando-o em meu sistema de arquivos local.
Para postar anteriormente eu estava usando algo como
'dout = new DataOutputStream(urlconn.getOutputStream());'
'dout.write(strXML.getBytes());'
'dout.write(strXML);'
e os dados resultantes no receptor estavam sendo convertidos para ?????mas então eu mudei para
'
dout=new OutputStreamWriter(urlconn.getOutputStream(),"UTF8");'
'dout.write(strXML);'
então os dados no final do receptor parecem estar corretos ...mas o problema ocorre com a maneira como isso é tratado no receptor neste caso.no código ASP do meu receptor que estou usando objStream.WriteLine (oXMLDom.xml)
...e aqui ele falha e começa a dar erro interno no servidor...por favor, sugira o que há de errado com a segunda abordagem.
Solução
Há grande quantidade de conversões potenciais acontecendo lá.Você deve verificar os dados em cada etapa:
- Verifique se você está retirando-o do banco de dados corretamente
- Veja como fica o XML transformado
- Observe o que acontece na rede (incluindo cabeçalhos HTTP)
- Verifique exatamente o que você está obtendo no ASP
Não basta imprimir as strings como strings - registre o valor Unicode de cada caractere, convertendo-o para int
:
for (int i = 0; i < text.length(); i++)
{
char c = text.charAt(i);
log("Character " + c + " - " + (int) c);
}