4

Javaを使用してANSI文字列をUTFに変換する方法はありますか?

DataInputStreamクラスのreadUTFメソッドとwriteUTFメソッドを使用して文字列を逆シリアル化およびシリアル化するカスタムシリアライザーがあります。ANSIでエンコードされた文字列を受け取り、長すぎる場合、最大100000文字の長さでエラーが発生します。

原因:java.io.UTFDataFormatException:エンコードされた文字列が長すぎます:106958バイト

ただし、私のJunitテストでは、120000'aの文字列を作成でき、完全に機能します。

次の投稿を確認しましたが、まだエラーがあります。

4

4 に答える 4

6

このエラーは、文字エンコードが原因ではありません。これは、UTF データの長さが間違っていることを意味します。

編集:これは書き込みエラーであり、読み取りエラーではないことに気付きました。

UTF の長さはわずか 2 バイトであるため、64K UTF-8 バイトしか保持できません。100K を書き込もうとしていますが、うまくいきません。

この制限はハードコーディングされており、これを回避する方法はありません。

if (utflen > 65535)
    throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");
于 2009-09-23T14:44:29.873 に答える
3
byte[] asciiBytes = ...;
String unicode = new String(asciiBytes, "US-ASCII");
byte[] utfBytes = unicode.getBytes("UTF-8");
于 2009-09-23T14:03:55.617 に答える
2

どのANSI コードページですか? すべて「ANSI」を参照するさまざまな文字エンコーディングが多数あります。DOS コードページは 437 です (描画記号なし)。コードページ 850 を使用すると、次のように動作します。

String unicode = new String(bytes, "IBM850");

(ここbytesで、ANSI 文字の配列です)。その後、 を使用して、この文字列を任意のエンコーディングでバイト配列に変換できますunicode.getBytes(encoding)

Windows はコードページ 1252 をよく使用します (そのためには「windows-1252」を使用します)。

于 2009-09-23T14:21:26.863 に答える
1

ZZ Coder は既に質問に回答していますが、このブログでより詳細な説明と回避策の提案を書いています。基本的に、書き込み可能な文字列が 64KB に制限されているため、問題は DataOutputStream にあります。この問題を回避するための回避策は他にもあります。使用している実際のバイナリ データ形式を壊さずに機能するものもあります...

于 2011-02-20T13:48:22.283 に答える