Nos últimos dias estive estudando sobre internacionalização (localization) de aplicativos Android.
Estava fazendo uns testes com datas e me deparei com um problema recorrente: acentuação incorreta. No caso, foi com o “Sábado”. A maioria já deve ter tido este problema, e quem trabalha em informática com certeza já perdeu algumas horas com este assunto.
Resolvi dar uma estudada mais detalhada nisto e registrar aqui algumas observações sobre o tema.
Primeiro, é preciso explicar que isso acontece devido ao fato que um dado foi gerado com uma codificação e lido com outra. Em linguagem técnica: gerado com uma página de código (encoding) e mostrado com outra.
Com essa informação, fica fácil encontrar a solução: é só ler os dados com a mesma codificação com que foi gravada!
Fácil de falar, difícil de fazer!
Como saber com que página de código foram gerados os dados?
Pesquisando na internet encontrei uma classe que fornece uma lista das páginas de códigos disponíveis no sistema: Charset.availableCharsets(). Com ela adaptei o programa listado a seguir.
// Pgm t7b.java teste páginas de código
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Set;
import java.util.SortedMap;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
class t7b {
public static void main (String[] args) throws Exception, UnsupportedEncodingException {
SortedMap charsets = Charset.availableCharsets();
Set names = charsets.keySet();
String sabado = "Sábado";
Calendar calendario = GregorianCalendar.getInstance();
Date data;
SimpleDateFormat formato = new SimpleDateFormat("EEEE");
int i = 0;
do {
data = calendario.getTime();
int dia = calendario.get(Calendar.DAY_OF_WEEK);
if (dia == 7) {
break;
}
i++;
calendario.add(Calendar.DAY_OF_WEEK, 1);
} while(i<7);
for (Iterator encName = names.iterator(); encName.hasNext();) {
String name = (String) encName.next();
System.out.print(name +" ");
if (!(name=="ISO-2022-CN"||name=="x-JISAutoDetect")) {
String diaSemana = new String(formato.format(data).getBytes(name));
if (diaSemana.equals(sabado)) {
System.out.printf(diaSemana+" Encoding name: "+ name);
}
}
System.out.println(" ");
}
}
}
O programa gera uma saída (parcial):
...
IBM-Thai
IBM00858 Sábado Encoding name: IBM00858
IBM01140
IBM01141
IBM420
IBM424
IBM437 Sábado Encoding name: IBM437
IBM500
IBM857 Sábado Encoding name: IBM857
IBM860 Sábado Encoding name: IBM860
IBM861 Sábado Encoding name: IBM861
IBM862 Sábado Encoding name: IBM862
IBM863
IBM864
IBM865 Sábado Encoding name: IBM865
IBM866
ISO-2022-CN
ISO-2022-JP
ISO-2022-JP-2
...
Obs.:
1. No meu caso, a página de código usada no formato é a “IBM860” e a página que estava imprimindo a “ISO8859-1”.
2. O encoding atua no momento da conversão de bytes para string.
Nenhum comentário:
Postar um comentário