5

Java は内部的に UTF-16 エンコーディングを使用していると読みました。つまり、次のような場合は理解しています。 String var = "जनमत"; 「जनमत」は内部的に UTF-16 でエンコードされます。したがって、この変数を以下のようなファイルにダンプすると:

fileOut = new FileOutputStream("output.xyz");
out = new ObjectOutputStream(fileOut);
out.writeObject(var);

ファイル「output.xyz」の文字列「जनमत」のエンコーディングは UTF-16 になりますか? また、後で ObjectInputStream を介してファイル「output.xyz」から読み取りたい場合、変数の UTF-16 表現を取得できますか?

ありがとう。

4

3 に答える 3

7

したがって、この変数をファイルにダンプすると、ファイル「output.xyz」の文字列「जनमत」のエンコーディングはUTF-16になりますか?

ファイル内の文字列のエンコーディングは、入力しObjectOutputStreamたい形式になります。。でのみ読み取ることができるブラックボックスとして扱う必要がありますObjectInputStream。(まじめな話-フォーマットはIIRCで十分に文書化されていますが、他のツールで読みたい場合は、オブジェクトをXMLやJSONなどとして自分でシリアル化する必要があります。)

後でObjectInputStreamを介してファイル「output.xyz」から読み取りたい場合、変数のUTF-16表現を取得できますか?

を付けてファイルを読み取るとObjectInputStream、元のオブジェクトのコピーが返されます。これには、 (バイトではなく)文字の単なるストリームであるが含まれます。getBytes()java.lang.Stringメソッドを介して必要に応じてUTF-16表現を取得できます(実際には必要ないと思いますが)。


結論として、シリアル化の内部の詳細についてはあまり心配しないでください。何が起こっているのかを知る必要がある場合は、自分でファイルを作成してください。興味がある場合は、JVMを信頼して正しいことを行ってください。

于 2010-12-08T17:41:52.373 に答える
1

閉じる:正確にはUTF-16ではありませんが、UCS-2のようなものです。ただし、どちらの方法でも、ほとんどの文字に2バイトを使用します(2文字のシーケンス、つまり、めったに使用されないコードポイントには4バイトを使用します)。

ObjectOutputStreamは、変更されたUTF-8と呼ばれるものを使用します。これはUTF-8に似ていますが、ゼロ文字は2バイトのシーケンスとして表されます。値0に戻ります。

しかし、あなたが本当に求めているのは、「私が文字列を書き、文字列を読むように機能するか」ということです。そして、その答えはイエスです。JDKは、バイトの書き込み時に適切なエンコードを行い、読み取り時にデコードを行います。

結果として得られる出力は少しコンパクトになると思うので、文字列には「writeUTF()」メソッドを使用する方が価値があります。ただし、「writeObject()」も機能します。もう少しメタデータが必要です。

于 2010-12-08T17:40:58.037 に答える
0

これに追加するだけObjectOutputStream.writeString()で、特定の文字列のUTFの長さを決定し、それを「標準」UTFまたは「長い」UTF形式で書き込みます。「長い」はjavadocに記載されています

「長い」UTF 形式は、UTF エンコード長を伝えるために (標準の 2 バイトではなく) 8 バイトのヘッダーを使用することを除いて、標準の UTF と同じです。

私はこれをコードから取得しました...

private void writeString(String str, boolean unshared) throws IOException {
    handles.assign(unshared ? null : str);
    long utflen = bout.getUTFLength(str);
    if (utflen <= 0xFFFF) {
        bout.writeByte(TC_STRING);
        bout.writeUTF(str, utflen);
    } else {
        bout.writeByte(TC_LONGSTRING);
        bout.writeLongUTF(str, utflen);
    }
}

そしてwriteObject(Object obj)彼らはチェックをします

if (obj instanceof String) {
    writeString((String) obj, unshared);
}
于 2010-12-08T17:51:55.450 に答える