テキスト エンコーディングの問題を回避する簡単な方法はありますか?
13 に答える
文字列から始める場合は、次のこともできます。
new ByteArrayInputStream(inputString.getBytes("UTF-8"))
テキスト エンコーディングの問題を避けることはできませんが、Apache Commons には既存の解決策があります。
Reader
にInputStream
:ReaderInputStream
Writer
にOutputStream
:WriterOutputStream
選択したエンコーディングを選択するだけです。
Reader は文字を扱い、InputStream はバイトを扱います。エンコーディングは、文字をバイトとして表現する方法を指定するため、この問題を実際に無視することはできません。問題の回避に関して、私の意見は次のとおりです。
実際の方法については、指摘されているように、「これらのクラスの明白な名前はReaderInputStreamとWriterOutputStreamです。」驚くべきことに、「これらは Java ライブラリには含まれていません」にもかかわらず、「反対の」クラスであるInputStreamReaderとOutputStreamWriter は含まれています。
そのため、多くの人がApache Commons IOを含む独自の実装を考え出しました。ライセンスの問題によっては、プロジェクトに commons-io ライブラリを含めるか、ソース コードの一部をコピーすることもできます (ここからダウンロードできます)。
- Apache ReaderInputStream: API /ソースコード直リンク
- Apache WriterOutputStream: API /ソースコード直リンク
ご覧のとおり、両方のクラスのドキュメントには、「JRE でサポートされているすべての文字セット エンコーディングが正しく処理される」と記載されています。
NBここでの他の回答の1つに関するコメントは、このバグについて言及しています。ただし、これは Apache Commons IO ReaderInputStream クラスではなく、Apache Ant ReaderInputStream クラス ( here ) に影響します。
また、String から始める場合は、次のようにCommons IOのorg.apache.commons.io.IOUtils を使用して、StringReader の作成をスキップし、InputStream を 1 ステップで作成できることに注意してください。
InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");
もちろん、テキストのエンコーディングについても考える必要がありますが、少なくとも変換は 1 つのステップで行われています。
テキストエンコーディングの問題を回避することはできませんが、Apachecommons-ioには
これらはkoders.comのPeterの回答で参照されているライブラリであり、ソースコードではなくライブラリへのリンクにすぎないことに注意してください。
これらのクラスのわかりやすい名前は、ReaderInputStream と WriterOutputStream です。残念ながら、これらは Java ライブラリには含まれていません。しかし、グーグルはあなたの友達です。
悪夢のようなすべてのテキスト エンコーディングの問題を回避できるかどうかはわかりません。
RFE はありますが、クローズされており、修正されません。
Reader
a の内容を anに書き込もうとしていOutputStream
ますか? もしそうなら、リーダーを に変換しようとする代わりに、をでラップしOutputStream
、から にOutputStreamWriter
を書き込む方が簡単です。char
Reader
Writer
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
Cactoosを使用できます(静的メソッドなし、オブジェクトのみ):
逆に変換することもできます:
WriterOutputStream を使用する際の警告 - ファイルへのバイナリ データの書き込みが常に適切に処理されるとは限りません。通常の出力ストリームと同じです。これには問題があり、追跡するのにしばらく時間がかかりました。
可能であれば、出力ストリームをベースとして使用することをお勧めします。文字列を書き込む必要がある場合は、ストリームの周りに OutputStreamWriter ラッパーを使用して実行します。テキストをバイトに変換する方が、その逆よりもはるかに信頼性が高いため、WriterOutputStream が標準の Java ライブラリに含まれていない可能性があります。
Javaが提供するものだけを使用してストリーム内の文字列を読み取るため。
InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));