1

Can we write Unicode Data in a File with ByteStreams? My code is:

 public static void main(String[] args) throws Exception {

    String str = "Русский язык ";
    FileOutputStream fos = new FileOutputStream("file path");
    fos.write(str.getBytes());
    fos.flush();
    fos.close();
}

Here i am using a byte stream to write unicode data, but it is writing properly.I am new to java but i have read that byte streams do not support unicode characters. So, why does it is working in this case?

4

2 に答える 2

3

バイトストリームはUnicode文字をサポートしていないことを読みました。

悪い情報源を使用したか、何かを誤解した可能性があります。バイトストリームはバイトをサポートします。したがって、バイトストリームは、バイトで表すことができるすべてのものをサポートします。ビデオ、テキスト、写真、音楽...バイトストリームがそれをサポートしていない場合、それはデジタルコンピュータではまったく使用できません。

単純に1と0のシーケンスであるものでそれらを表す秘訣は、合意されたルールを使用することです。特定のルールに従ってテキストをエンコードすると、受信者は同じルールを使用してテキストをデコードし直すことができます。

"Русский язык"キリル文字をサポートする任意のエンコーディングでバイトとして表すことができます。ユニコードのエンコーディングのいずれか:UTF-8、UTF-16、UTF-32; Windows-1251、KOI8-R、KOI8-U、ISO-8859-5 ..

これは、これらのエンコーディングが相互に互換性があるという意味ではありません。キリル文字のエンコードに関しては、これらはすべて互換性がないため、1つのエンコードでエンコードされたテキストは、そのエンコードで厳密にデコードする必要があります。

.getBytes()プラットフォームのデフォルトエンコーディングを使用します。これはたまたまキリル文字をサポートするものでした。UTF-8だと思われるかもしれませんが、Windowsを使用している場合は、Cp1251である可能性がはるかに高くなります。「Unicode文字」を使用したからといって、ファイルが物理的にUTFエンコーディングでエンコードされているという罠にはまらないでください。それはエンコーディングの問題につながります。

したがって、プログラムがどのプラットフォームでも同じように機能し、プログラムが作成したファイルがどのエンコーディングであるかを常に把握できるように、エンコーディングについて常に明示してください。コードを使用すると、次のことが可能になります。

String str = "Русский язык ";
FileOutputStream fos = new FileOutputStream("file path");
fos.write(str.getBytes("UTF-8"));
fos.flush();
fos.close();

または他の答えによって示唆されているように:

String str = "Русский язык ";
OutputStreamWriter osw = new OutputStreamWriter(
        new FileOutputStream("file path"), "UTF-8"
);
osw.write(str);
osw.flush();
osw.close();

これらは技術的にはまったく同じです。テキストはUTF-8ルールに従ってバイトに変換されています。

于 2012-12-14T10:22:15.273 に答える
1

多くの場合、OutputStreamWriter で OutputStream を Writer にラップして、文字データを書き込むのが最適です。

Writer out = new OutputStreamWriter(new FileOutputStream("file path"), "UTF-8"));
于 2012-12-14T06:02:41.817 に答える