Por que o Java BufferredReader () não está lendo os caracteres árabe e chinês corretamente?
Pergunta
Estou tentando ler um arquivo que contém caracteres em inglês e árabe em cada linha e outro arquivo que contém caracteres em inglês e chinês em cada linha. No entanto, os personagens do árabe e dos chineses não mostram corretamente - eles apenas aparecem como pontos de interrogação. Alguma ideia de como posso resolver esse problema?
Aqui está o código que eu uso para ler:
try {
String sCurrentLine;
BufferedReader br = new BufferedReader(new FileReader(directionOfTargetFile));
int counter = 0;
while ((sCurrentLine = br.readLine()) != null) {
String lineFixedHolder = converter.fixParsedParagraph(sCurrentLine);
System.out.println("The line number "+ counter
+ " contain : " + sCurrentLine);
counter++;
}
}
Edição 01
Depois de ler a linha e obter a palavra árabe e chinesa, uso uma função para traduzi -los simplesmente pesquisando Dado texto em árabe em um ArrayList (que contém todas as palavras esperadas) (usando indexOf (); método). Então, quando o índice da palavra é encontrado, ele é usado para chamar a palavra em inglês, que tem o mesmo índice em outro Arraylist. No entanto, essa pesquisa sempre retorna falsa porque falha ao pesquisar os pontos de interrogação, em vez dos caracteres árabe e chinês. Então, meu System.out.println Print mostra -me nulos, um para cada falha na tradução.
*Estou usando NetBeans 6.8 Mac versão IDE
Edição 02
Aqui está o código que busca tradução:
int testColor = dbColorArb.indexOf(wordToTranslate);
int testBrand = -1;
if ( testColor != -1 ) {
String result = (String)dbColorEng.get(testColor);
return result;
} else {
testBrand = dbBrandArb.indexOf(wordToTranslate);
}
//System.out.println ("The testBrand is : " + testBrand);
if ( testBrand != -1 ) {
String result = (String)dbBrandEng.get(testBrand);
return result;
} else {
//System.out.println ("The first null");
return null;
}
Na verdade, estou pesquisando 2 Arraylists que podem conter a palavra desejada para traduzir. Se não conseguir encontrá -los nos dois Arraylists, o NULL será devolvido.
Edição 03
Quando depuro, descobri que as linhas que estão sendo lidas são armazenadas na minha variável de string como a seguinte:
"3;0000000000;0000001001;1996-06-22;;2010-01-27;����;;01989;������;"
Edição 03
O arquivo que estou lendo me foi dado depois de ter sido modificado por outro programa (sobre o qual não sei nada ao lado dele é feito em VB), o programa fez as letras árabes que não parecem aparecer corretamente. Quando verifiquei a codificação do arquivo no bloco de notas ++, mostrou que é ANSI. No entanto, quando eu o converti para UTF8 (que substituiu a carta árabe por outra em inglês) e depois a converto em Ansi, o árabe se tornou interrogatório!
Solução
Classe de conveniência para ler arquivos de caracteres. Os construtores desta classe assumem que a codificação de caractere padrão e o tamanho padrão do byte-buffer são apropriados. Para especificar esses valores, construa um InputStreamReader em um FileInputStream.
Então:
Reader reader = new InputStreamReader(new FileInputStream(fileName), "utf-8");
BufferedReader br = new BufferedReader(reader);
Se isso ainda não funcionar, talvez seu console não esteja configurado para exibir corretamente os caracteres UTF-8. A configuração depende do IDE usada e é bastante simples.
Atualizar : No código acima, substitua utf-8
com cp1256
. Isso funciona bem para mim (WinXP, JDK6)
Mas eu recomendo que você insista no arquivo gerado usando o UTF-8. Porque cp1256
Não funcionará para o chinês e você terá problemas semelhantes novamente.
Outras dicas
Provavelmente, é provavelmente ler as informações corretamente, no entanto, seu fluxo de saída provavelmente não é UTF-8 e, portanto, qualquer caractere que não possa ser mostrado no seu conjunto de caracteres de saída está sendo substituído pelo '?'.
Você pode confirmar isso tirando cada personagem e imprimindo o personagem ordinal.
public void writeTiFile(String fileName,String str){
try {
FileOutputStream out = new FileOutputStream(fileName);
out.write(str.getBytes("windows-1256"));
} catch (Exception ex) {
ex.printStackTrace();
}
}