Pergunta

Existe uma maneira fácil de evitar problemas de codificação de texto?

Foi útil?

Solução

Você realmente não pode evitar lidar com os problemas de codificação de texto, mas existem soluções:

Você só precisa escolher a codificação de sua preferência.

Outras dicas

Se você está começando com uma String, também pode fazer o seguinte:

new ByteArrayInputStream(inputString.getBytes("UTF-8"))

Bem, um Reader lida com caracteres e um InputStream lida com bytes.A codificação especifica como você deseja representar seus caracteres como bytes, portanto você não pode ignorar o problema.Quanto a evitar problemas, minha opinião é:escolha um conjunto de caracteres (por exemplo"UTF-8") e persista.

Quanto a como realmente fazer isso, como foi apontado, "os nomes óbvios para essas classes são LeitorInputStream e WriterOutputStream."Surpreendentemente,"estes não estão incluídos na biblioteca Java"mesmo que as classes 'opostas', Leitor de entradaStream e OutputStreamWriter são incluído.

Então, muitas pessoas criaram suas próprias implementações, incluindo Apache IO comum.Dependendo das questões de licenciamento, você provavelmente conseguirá incluir a biblioteca commons-io em seu projeto, ou até mesmo copiar uma parte do código-fonte (que pode ser baixado aqui).

Como você pode ver, a documentação de ambas as classes afirma que "todas as codificações de charset suportadas pelo JRE são tratadas corretamente".

N. B.Um comentário em uma das outras respostas aqui menciona esse bug.Mas isso afeta o Apache Formiga Classe ReaderInputStream (aqui), não o apache IO comum Classe ReaderInputStream.

Observe também que, se você estiver começando com uma String, poderá pular a criação de um StringReader e criar um InputStream em uma única etapa usando org.apache.commons.io.IOUtils de IO comum igual a:

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

Claro que você ainda precisa pensar na codificação do texto, mas pelo menos a conversão acontece em uma única etapa.

Usar:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

Dessa forma, não é necessária uma conversão inicial para String e então para byte[], que aloca muito mais memória heap, caso o relatório seja grande.Ele converte em bytes dinamicamente conforme o fluxo é lido, diretamente do StringBuffer.

Ele usa CharSequenceInputStream do projeto Apache Commons IO.

Os nomes óbvios para essas classes são ReaderInputStream e WriterOutputStream.Infelizmente, eles não estão incluídos na biblioteca Java.No entanto, o Google é seu amigo.

Não tenho certeza se isso resolverá todos os problemas de codificação de texto, que são um pesadelo.

Existe um RFE, mas está fechado, não vai consertar.

Você não pode evitar problemas de codificação de texto, mas Apache Commons-io tem

Observe que essas são as bibliotecas mencionadas na resposta de Peter em koders.com, apenas links para a biblioteca em vez do código-fonte.

Você está tentando escrever o conteúdo de um Reader para um OutputStream?Nesse caso, você terá mais facilidade em embrulhar o OutputStream em um OutputStreamWriter e escreva o charé do Reader para o Writer, em vez de tentar converter o leitor em um InputStream:

final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
    writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block

Um aviso ao usar WriterOutputStream - ele nem sempre lida com a gravação de dados binários em um arquivo de maneira adequada/igual a um fluxo de saída normal.Tive um problema com isso que demorei um pouco para descobrir.

Se possível, recomendo usar um fluxo de saída como base e, se precisar escrever strings, use um wrapper OUtputStreamWriter em torno do fluxo para fazer isso.É muito mais confiável converter texto em bytes do que o contrário, provavelmente por isso que WriterOutputStream não faz parte da biblioteca Java padrão

Você pode usar Cactos (sem métodos estáticos, apenas objetos):

Você também pode converter o contrário:

Para ler uma string em um fluxo usando apenas o que o Java fornece.

InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top