2

UTF-8 エンコーディングを使用して Java オブジェクトを String にシリアライズする関数を作成しようとしています。これは私の実装です:

public static String serializeToString(DefaultMutableTreeNode tree) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    try {
        ObjectOutput out = new ObjectOutputStream(byteArrayOutputStream);
        out.writeObject(tree);
        return byteArrayOutputStream.toString("UTF-8");
    } catch (IOException e) {
        return null;
    }
}

しかし、うまくいかないようです。結果の文字列を UTF-8 エンコーディングのみを受け入れるデータベースに渡そうとしましたが、エンコーディングの問題でエラーが発生して失敗しました。

私の質問は次のとおりです。

  1. 私の実装の問題は何ですか?
  2. 結果の文字列が UTF-8 であるかどうかを調べるにはどうすればよいですか?

どうもありがとう

よろしく

4

3 に答える 3

3

これは良い考えではありません。任意のバイナリ配列が常に有効な UTF-8 シーケンスに変換されるとは限りません。配列をバイナリ blob としてデータベースに配置するか、配列を Base64 エンコーディングのような文字列に変換する必要があります。

于 2012-05-23T20:49:22.370 に答える
1

UTF-8エンコーディングを使用してJavaオブジェクトを文字列にシリアル化する関数を作成しようとしています。

はい...コードが実際に行っているのは、オブジェクトをバイトにシリアル化してから、Stringコンストラクターに「これらのバイトはいくつかのUnicodeコードポイントの有効なUTF-8エンコーディングです」と伝えることです。問題は、(一般的に言えば)それらはそうではないということです...そしてUTF-8デコーダーがそれらをJava文字列で使用されるUTF-16表現に変換しようとすると、無効なシーケンスを見つけて「無効な」に置き換えます文字」コードポイント。

任意のバイトをJava文字列として表現する場合は、base64エンコーディングなどを使用する必要があります。より良いアイデアは、バイトをBlobとしてデータベースに入れることです。

于 2012-05-24T02:26:33.683 に答える
1

文字列に印刷できない文字が含まれることになりますが、DB はこれをまったく好まないでしょう。Java ByteArrayOutputStream のドキュメントは、印刷できない文字を印刷可能として再コード化する可能性があることを示唆していますが、コードを見ると、エラーでプログラムを停止する以外に何もしていないことがわかりません。また、将来、そのような文字列で何をするかわかりません。

バイトの 256 の可能な値の一部 (約 4 分の 1) のみが有効な ASCII 文字です。ほとんどのデータベースは、それらを文字列の一部として取りません。したがって、エラーメッセージ。(Unicode と UTF-8 にも同じ問題があります。)

6ビットごとに印刷可能な文字を含むバイトに変換することにより、バイナリデータを印刷可能な文字に変換することにより、データベースにバイナリデータを保存したことがあります。しかし、単純な ASCII エンコーディングを使用し、文字をバイナリに変換するコードを書きました。その後、バイナリ データをデータベースの文字列に格納し、後で取得することができました。私はむしろ強制されました。私はあなたがそれをすることをお勧めしません.

「文字列」がどのように見えるかを確認したい場合は、各バイトを整数として出力し、ASCII テーブルと比較してください。Unicode の細かい点を考慮しなくても、おそらく問題に気付くでしょう。

于 2012-05-23T20:57:47.170 に答える