1

私は次のようなjava文字列に遭遇しました:以下は誤りです:

body.equals(new String(body.getBytes()));

これは、Stringコンストラクターがデフォルトでbody byte []のエンコードをUTF-8として処理しているためだと思いますが、100%確実ではありません。この文字列をbyte[]に格納し、後で元に戻すにはどうすればよいですか?byte []がどのエンコーディングであるかを判別できる必要があると思います。これを行うにはどうすればよいですか?

いくつかのコンテキスト:データを圧縮してデータベースに保存し、後で圧縮を解除して圧縮されていないbyte[]を元の文字列に戻すことができるようにbyte[]が必要です。文字列は元々、ウェブページをダウンロードしたライブラリからのものであり、私に渡す前に、文字列に対してどのような処理が行われるのかわかりません。

4

3 に答える 3

2

プラットフォームのデフォルトの文字セットは、エンコードとデコードに使用されます。

問題は、US-ASCIIなどの文字セットが制限されている可能性があることです。文字列内の文字がその文字セットの外にある場合、それは失われます。

UTF-8、UTF-16など、すべてのUnicode文字をカバーする文字セットを使用します。

于 2012-10-16T22:10:11.313 に答える
1

文字列からバイト配列を作成するときと、バイト配列から文字列を作成するときの両方で、同じ文字セットを使用するようにしてください。

したがって、例は次のようになります。

body.equals(new String(body.getBytes("utf-8"), "utf-8"));

これにより、環境に関係なく、バイトが理解されることが保証されます。

また、ほぼ間違いなく、ユニコードを使用する必要があります。シングルバイトエンコーディング(ISOコードページなど)を選択した場合、現在ニーズを満たすシングルバイトエンコーディングがあったとしても、将来的に後悔する可能性があります。

于 2012-10-16T22:05:38.563 に答える
1

エンコーディングを指定せずにバイトと文字を変換する場合、動作はプラットフォームに依存します。デフォルトのエンコーディングが使用されます。これはJVM全体であり、システムによって異なります。エンコーディングがASCIIで、ASCII以外の文字がいくつかある場合、どうなるか正確にはわかりませんが、別の文字列を取得することはわかっています。これを回避するには、コンサートを行うたびにエンコーディングを指定する必要があります。

于 2012-10-16T22:08:59.037 に答える