Por que o Java BufferredReader () não está lendo os caracteres árabe e chinês corretamente?

StackOverflow https://stackoverflow.com/questions/2260325

  •  20-09-2019
  •  | 
  •  

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!

Foi útil?

Solução

FileReader Javadoc:

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();
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top