97

テキスト エンコーディングの問題を回避する簡単な方法はありますか?

4

13 に答える 13

96

文字列から始める場合は、次のこともできます。

new ByteArrayInputStream(inputString.getBytes("UTF-8"))
于 2010-07-13T09:35:40.783 に答える
50

テキスト エンコーディングの問題を避けることはできませんが、Apache Commons には既存の解決策があります。

選択したエンコーディングを選択するだけです。

于 2008-09-15T12:01:47.050 に答える
47

Reader は文字を扱い、InputStream はバイトを扱います。エンコーディングは、文字をバイトとして表現する方法を指定するため、この問題を実際に無視することはできません。問題の回避に関して、私の意見は次のとおりです。

実際の方法については、指摘されているように、「これらのクラスの明白な名前はReaderInputStreamWriterOutputStreamです。」驚くべきことに、「これらは Java ライブラリには含まれていません」にもかかわらず、「反対の」クラスであるInputStreamReaderOutputStreamWriter 含まれています。

そのため、多くの人がApache Commons IOを含む独自の実装を考え出しました。ライセンスの問題によっては、プロジェクトに commons-io ライブラリを含めるか、ソース コードの一部をコピーすることもできます (ここからダウンロードできます)。

ご覧のとおり、両方のクラスのドキュメントには、「JRE でサポートされているすべての文字セット エンコーディングが正しく処理される」と記載されています。

NBここでの他の回答の1つに関するコメントは、このバグについて言及しています。ただし、これは Apache Commons IO ReaderInputStream クラスではなく、Apache Ant ReaderInputStream クラス ( here ) に影響します。

于 2012-10-17T18:20:00.967 に答える
19

また、String から始める場合は、次のようにCommons IOのorg.apache.commons.io.IOUtils を使用して、StringReader の作成をスキップし、InputStream を 1 ステップで作成できることに注意してください。

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

もちろん、テキストのエンコーディングについても考える必要がありますが、少なくとも変換は 1 つのステップで行われています。

于 2010-03-03T18:21:08.313 に答える
7

commons-io2.0にはWriterOutputStream

于 2010-11-24T15:41:38.883 に答える
5

テキストエンコーディングの問題を回避することはできませんが、Apachecommons-ioには

これらはkoders.comのPeterの回答で参照されているライブラリであり、ソースコードではなくライブラリへのリンクにすぎないことに注意してください。

于 2012-05-18T15:14:50.840 に答える
5

これらのクラスのわかりやすい名前は、ReaderInputStream と WriterOutputStream です。残念ながら、これらは Java ライブラリには含まれていません。しかし、グーグルはあなたの友達です。

悪夢のようなすべてのテキスト エンコーディングの問題を回避できるかどうかはわかりません。

RFE はありますが、クローズされており、修正されません。

于 2008-09-15T12:00:00.720 に答える
4

Readera の内容を anに書き込もうとしていOutputStreamますか? もしそうなら、リーダーを に変換しようとする代わりに、をでラップしOutputStream、から にOutputStreamWriterを書き込む方が簡単です。charReaderWriterInputStream

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
于 2009-09-01T04:03:53.017 に答える
2

Cactoosを使用できます(静的メソッドなし、オブジェクトのみ):

逆に変換することもできます:

于 2017-08-06T18:07:04.220 に答える
1

WriterOutputStream を使用する際の警告 - ファイルへのバイナリ データの書き込みが常に適切に処理されるとは限りません。通常の出力ストリームと同じです。これには問題があり、追跡するのにしばらく時間がかかりました。

可能であれば、出力ストリームをベースとして使用することをお勧めします。文字列を書き込む必要がある場合は、ストリームの周りに OutputStreamWriter ラッパーを使用して実行します。テキストをバイトに変換する方が、その逆よりもはるかに信頼性が高いため、WriterOutputStream が標準の Java ライブラリに含まれていない可能性があります。

于 2013-07-05T16:14:43.933 に答える
-1

Javaが提供するものだけを使用してストリーム内の文字列を読み取るため。

InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));
于 2015-01-07T14:21:19.983 に答える