Tentei usar o java.io.FileReader para ler alguns arquivos de texto e convertê-los em uma string, mas descobri que o resultado está codificado incorretamente e não é legível.
Aqui está o meu ambiente:
Windows 2003, codificação do sistema operacional: CP1252
Java 5.0
Meus arquivos são codificados em UTF-8 ou CP1252 e alguns deles (arquivos em UTF-8) podem conter caracteres chineses (não latinos).
Eu uso o seguinte código para fazer o meu trabalho:
private static String readFileAsString(String filePath)
throws java.io.IOException{
StringBuffer fileData = new StringBuffer(1000);
FileReader reader = new FileReader(filePath);
//System.out.println(reader.getEncoding());
BufferedReader reader = new BufferedReader(reader);
char[] buf = new char[1024];
int numRead=0;
while((numRead=reader.read(buf)) != -1){
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
return fileData.toString();
}
O código acima não funciona. Eu descobri que a codificação do FileReader é CP1252, mesmo que o texto seja codificado em UTF-8. Mas o JavaDoc do java.io.FileReader diz que:
Os construtores dessa classe assumem que a codificação de caracteres padrão e o tamanho padrão do buffer de bytes são adequados.
Isso significa que não sou obrigado a definir a codificação de caracteres sozinho se estiver usando o FileReader? Mas atualmente recebi dados codificados incorretamente. Qual é a maneira correta de lidar com minha situação? Obrigado.
Respostas:
Sim, você precisa especificar a codificação do arquivo que deseja ler.
Sim, isso significa que você precisa saber a codificação do arquivo que deseja ler.
Não, não existe uma maneira geral de adivinhar a codificação de qualquer arquivo de "texto simples".
Os construtores de um argumento
FileReader
sempre usam a codificação padrão da plataforma, que geralmente é uma má ideia .Desde que o Java 11
FileReader
também ganhou construtores que aceitam uma codificação:new FileReader(file, charset)
enew FileReader(fileName, charset)
.Nas versões anteriores do java, você precisa usar .
new InputStreamReader(
new FileInputStream(pathToFile)
, <encoding>)
fonte
InputStreamReader
é umajava.io
classe, seria "UTF8"?StandardCharsets.UTF_8
não há chance de erros de digitação ;-) Mas sim, se você usar uma string,"UTF8"
ela estará correta (embora pareço lembrar que ela aceita os dois lados).Byte Order Mark
, juntamente com .. bem .. estabelecer a ordem dos bytes! :) Como tal, acho estranho que o FileReader do Java não seja capaz de detectar automaticamente o UTF-16 que possui uma lista técnica ... Na verdade, eu escrevi uma vezUnicodeFileReader
que faz exatamente isso. Infelizmente, código fonte fechado, mas o Google tem o UnicodeReader, que é muito semelhante.FileReader
usa a codificação padrão da plataforma Java, que depende das configurações do sistema do computador em que está sendo executado e geralmente é a codificação mais popular entre os usuários nesse local.Se esse "melhor palpite" não estiver correto, será necessário especificar a codificação explicitamente. Infelizmente,
FileReader
isso não é permitido (grande supervisão na API). Em vez disso, você deve usarnew InputStreamReader(new FileInputStream(filePath), encoding)
e, idealmente, obter a codificação a partir de metadados sobre o arquivo.fonte
FileReader
usa a codificação padrão da plataforma Java, que depende das configurações do sistema do computador em que está sendo executado e geralmente é a codificação mais popular entre os usuários nesse local". Eu não diria isso. Pelo menos do Windows. Por algumas razões técnicas / históricas estranhas, a JVM ignora o fato de que Unicode é a codificação recomendada no Windows para 'todos os novos aplicativos' e, em vez disso, sempre age como se a codificação herdada configurada como fallback para aplicativos herdados fosse o 'padrão da plataforma'.Desde o Java 11, você pode usar isso:
fonte
Para o Java 7+ doc, você pode usar este:
Aqui estão todos os documentos de charsets
Por exemplo, se o seu arquivo estiver no CP1252, use este método
Aqui estão outros nomes canônicos para codificações Java, tanto para documentos de E / S quanto de NIO
Se você não sabe com codificação exatamente você tem em um arquivo, você pode usar algumas libs de terceiros como esta ferramenta do Google este que funciona razoavelmente arrumado.
fonte
FileInputStream com InputStreamReader é melhor do que usar diretamente o FileReader, porque o último não permite especificar o conjunto de caracteres de codificação.
Aqui está um exemplo usando BufferedReader, FileInputStream e InputStreamReader juntos, para que você possa ler linhas de um arquivo.
fonte
Para outros idiomas latinos, por exemplo, cirílico, você pode usar algo como isto:
e verifique se seu
.txt
arquivo foi salvo com o formatoUTF-8
(mas não como padrãoANSI
). Felicidades!fonte