Erro em conversão de String

11 respostas
java
R

Recebo uma string em formato windows-1252, assim:

opera��o.

Minha aplicação java no netbeans está configurada em UTF-8, se eu mudar para
windows-1252 imprime o texto com os caracteres especiais na forma
correta, mas acontece que não quero mudar a minha aplicação de UTF-8
para windows-1252.

Então o que preciso é converter em tempo de execução uma string em windows-1252 para UTF-8.

Fiz assim:

String novaString = new String(retorno.getBytes("CP1252"), "UTF-8");  
// e assim
String novaString = new String(retorno.getBytes("windows-1252"), "UTF-8");

Mas continua com os caracteres especiais errados…

Como posso converter uma string de windows-1252 para UTF-8

11 Respostas

L

Como você está recebendo essa string? De onde ela está vindo?

R

Ela está vindo do retorno do emulador SAT(aparelho para emissão de cupom fiscal que está substituindo as impressoras fiscais).

Ele retorna uma String em windows-1252.

M

Gostaria de ver mais do seu código… como vc esta setando o valor em retorno?

R

Faço assim:

SatJNA sat = SatJNA.Instance;
    //EnviarDadosVenda é um método da DLL do SAT, este método que retorna a String em windows-1252
    String retorno = sat.EnviarDadosVenda(numSessao, LerArquivoSat.getCodigoAtivacao(), os.toString());
M

EnviarDadosVendas retorna uma String?

Faça retornar um vetor de bytes assim:

byte[] retorno = sat.EnviarDadosVenda(numSessao, LerArquivoSat.getCodigoAtivacao(), os.toString());
String novaString = new String(retorno, "UTF-8");

Adendo:
Pelo que entendi ali agora, você não pode mexer no método EnviarDadosVendas porque esta encapsulado?

String retorno = sat.EnviarDadosVenda(numSessao, LerArquivoSat.getCodigoAtivacao(), os.toString());
 String novaString = new String(retorno.getBytes, "UTF-8");
R

Fiz assim:

String retorno = sat.EnviarDadosVenda(numSessao, LerArquivoSat.getCodigoAtivacao(), os.toString());
String novaString = new String(retorno.getBytes(), "UTF-8");
System.out.println("NovaString: " + novaString);

mas continua exibindo errado…

Também tentei assim, mas também continuou errado:

String retorno = sat.EnviarDadosVenda(numSessao, LerArquivoSat.getCodigoAtivacao(), os.toString());
String novaString = new String(retorno.getBytes("windows-1252"), "UTF-8");
System.out.println("NovaString: " + novaString);]]

Saída da string:
|Emitido com sucesso + conte?do notas

M

Vamos fazer de um jeito mais feio então:

String retorno = sat.EnviarDadosVenda(numSessao, LerArquivoSat.getCodigoAtivacao(), os.toString());
String utf16 = new String(retorno , Charset.forName("windows-1252"));
String novaString = new String(utf16.getBytes(StandardCharsets.UTF_8));

Se o código acima não funcionar, me da um exemplo de valor que retorno pode receber, pra eu poder fazer alguma coisa debugando por aqui.

R

Tentei assim:

String retorno = sat.EnviarDadosVenda(numSessao, LerArquivoSat.getCodigoAtivacao(), os.toString());
String utf16 = new String(retorno.getBytes(), Charset.forName("windows-1252"));
String novaString = new String(utf16.getBytes(StandardCharsets.UTF_8));

a saída de novaString foi esta:

Emitido com sucesso + conte�do nota
O conteudo do Retorno do SAT pode receber, por exemplo:

Emitido com sucesso + conteúdo nota
SAT em operação

R

Alguém com mais alguma sugestão?

L

Tinha montado um exemplo aqui, mas obtendo o texto em windows-1252 de um arquivo txt (lendo com Scanner). Fiz a leitura como windows-1252 e funcionou corretamente (vou pegar o código que fiz e vou postar aqui amanhã).

R

Ok, quando puder posta aqui

Vlw

Criado 7 de julho de 2016
Ultima resposta 11 de jul. de 2016
Respostas 11
Participantes 3