Caracteres Especiais

Estou fazendo integração com SAT e o retorno do métodoConsultarSAT(numSessao) está vindo com caracteres especiais:

816321|08000|SAT-CFe em opera��o.||

Acontece que a DLL do emulador do SAT retorna uma String com página de código em CP1252(windows-1252).

Minha aplicação java 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…

Se essa integração for por webservices, você pode passar na chamada um cabeçalho especificando o Content Type como CP1252.

Ou você pode fazer uma conversão como em:

Então, não é via webservice, é por uma DLL.

Já tentei fazer 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 errado os caracteres…
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);

Neste link que você postou tem isso:

byte[] sourceBytes = getRawBytes();

o que seria este método getRawBytes(), o cara que postou a solução nao diz nada deste método que ele usa na solução…

O método getRawBytes é da biblioteca ZXing, que retorna um array de bytes. É algo irrelevante para o seu problema.

Fiz um teste aqui: meu projeto está como UTF-8 e tentei rodar o seguinte code snipet e funcionou:

public static void main(String[] args) {
	
	String retorno = "áéíóúãõç!@#$%¨&*()ÁÉÍÓÚÀàâÊÔ";
	
	String novaString = null;
	
	try {
	
		novaString = new String(retorno.getBytes("windows-1252"), "windows-1252");
		
	} catch (UnsupportedEncodingException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	System.out.println("NovaString: " + novaString);
}

Fiz o teste com este seu código e também funcionou…

Minha situação é a seguinte:

A aplicação java no netbeans está configurada em UTF-8, e a string de retorno que recebo do emulador SAT vem em windows-1252.

Se eu altero a minha aplicação no netbeans para windows-1252, os caracteres são exibidos corretamente…
Mas tenho que deixar minha aplicação em UTF-8.

O problema é que não estou conseguindo converter a string de retorno de windows-1252 para UTF-8.

Manda um exemplo de String de retorno para eu testar aqui.
O projeto é Web ou standalone?

O projeto é Desktop, estou usando a DLL do emulador SAT da fazenda
A DLL retorna String em cp1252(windows-1252)

Retornos possíveis:

Emitido com sucesso + conteúdo nota

SAT em operação

	public static void main(String[] args) throws UnsupportedEncodingException {

		String retorno = "Emitido com sucesso + conteúdo nota SAT em operação";

		InputStream stream = new ByteArrayInputStream(retorno.getBytes("windows-1252"));

		BufferedInputStream iStream = new BufferedInputStream(stream);

		InputStreamReader reader = new InputStreamReader(iStream, "UTF-8");

		String novaString = getStringFromInputStream(iStream);

		System.out.println("NovaString: " + novaString);
	}

	private static String getStringFromInputStream(InputStream is) {

		BufferedReader br = null;
		StringBuilder sb = new StringBuilder();

		String line;
		try {

			br = new BufferedReader(new InputStreamReader(is));
			while ((line = br.readLine()) != null) {
				sb.append(line);
			}

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (br != null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		return sb.toString();

	}

Testei este código aqui diretamente com o emulador SAT, mas o resultado foi este:

SAT-CFe em opera??o

O engraçado é que se eu mudo a aplicação no netbeans para windows-1252 funciona tudo perfeitamente sem conversão nenhuma, mas quando a aplicação está em UTF-8 e precisa fazer a conversão, não funciona…

Olá,

Você deve ser lembrar que dependendo do meio que está utilizando para ver a saída, esse meio pode fazer a conversão dos caracteres automática para aqueles caracteres que o meio suporta. Por exemplo, se a saída for o prompt do DOS, e assim por diante.

Já testei 2 tipos de saída:

System.out.println(); direto no netbeans.

e

gravando em um arquivo .txt

Olá,

A console do NetBeans utiliza qual conjunto de caracteres ?

Acho que é UTF-8.

Onde vejo esta informação?

Clicando em propriedades no projeto, tem a opção “Codificação”, lá está UTF-8, é isto?

Olá,

Questionamento semelhante no StackOverflow:

E a seguinte observação:

Apparently, the console encoding happens to be the same as the project encoding; attempting to change this by setting the file.encoding System property yields nothing. In this case, all UTF-8 encoded strings will be displayed without issues. However, if your file happens to be encoded with UTF-16BE/LE or any other encoding scheme, then the console will display gibberish/mojibake as it is impossible to change the terminal/console encoding on an as needed basis. In this case, the preferred approach is to store files in the same encoding as the project encoding, so that displaying their contents via System.out will not result in displaying gibberish.

Então, mas acho que o problema não é a codificação do console, pois já tentei armazenar em um arquivo, e continua com o problema…

String retorno = sat.ConsultarSAT(numSessao);
String novaString = new String(retorno.getBytes("windows-1252"), "UTF-8");
PrintWriter gravarArq = new PrintWriter(caminhoArq, "UTF-8");
gravarArq.print(novaString);
gravarArq.close();

Olá Rodrigo,

O problema neste caso é porque o JNA vem configurado por padrão para trabalhar com UTF-8.

Teste colocar essa linha antes de carregar a DLL:

System.setProperty ("jna.encoding", "windows-1252");

Mais detalhes: https://bitbucket.org/kenos/kenos-sat/src

Abs!
Ricardo