0

私は現在、Shift-JIS形式の出力CSVファイルでいくつかのテストを行っていますが、どういうわけか、以下のように日本語の文字の違いの試行で奇妙なことがわかりました:

私のコード:

try {
        String dat2 = "カヨ ハラダ";
        String dat = "2バイト文字出力";
        String fileName = "C:/Users/CR/Desktop/test2.txt";

        FileOutputStream fos = new FileOutputStream(fileName);
        OutputStreamWriter osw = new OutputStreamWriter(fos, "Shift_JIS");
        BufferedWriter fp = new BufferedWriter(osw);

        fp.write(new String(dat2.getBytes("Shift_JIS"));
        fp.newLine();

        fp.flush();
        fp.close();
        fos.close();

    } catch (Exception ex) {
        throw new Exception(ex);
    }

dat2 の結果:

Shift-JIS形式ではありませんでした

Shift-JIS形式ではなく、単語も間違っているため、別の試行:

データの結果:

ここに画像の説明を入力

これは正しく、期待される形式でも表示できます。

何か問題がありましたか?または内容が正しくありませんか?

ありがとう !

4

3 に答える 3

1

次の行を除いて、ほとんどのコードは適切です。

    fp.write(new String(dat2.getBytes("Shift_JIS"));

Java 文字列は (多かれ少なかれ) エンコーディング中立です。エンコーディングは、文字列をファイルに書き込む (またはネット経由で送信する) ときに有効になります。あなたの場合、エンコーディング変換は、正しく設定したOutputStreamWriterによって処理されます。

したがって、行はより単純になります。

    fp.write(dat2);

ところで:

表現

new String(dat2.getBytes("Shift_JIS")

最初に文字列dat2Shift_JISエンコーディングのバイト配列に変換し、次にデフォルトのエンコーディング (おそらく UTF-8) を使用してバイト配列を文字列に変換するため、間違ったエンコーディングを使用してバイト配列をデコードします。

PS

もう一つ。CSV ファイルなどのテキスト ファイルには、それらの書き込みに使用されたエンコーディングを示す方法がありません (例外: BOM 付きの UTF)。適切な推測を行うためのヒューリスティックしかありません。そのため、テキスト エディターでそれらを開くときは、正しいエンコーディングで開かれたかどうかを確認し、必要に応じて修正する必要があります。最初のスクリーン ショットでは、ステータス バーに「ANSI」と表示されています。それはあなたが望むものではありません。

于 2016-08-24T11:05:32.093 に答える