0

一連のstring.replaceAllsを使用して、テキストファイル内のすべてのUTF-8特殊文字をASCIIおよびHTMLエンコーディングで交換しようとしています。途中で私は特に頑固なものにぶつかりました:\ uAC8B、UTF-8ミッドドット。

半分の時間でキャラクターを切り取る行は次のとおりです。

  string_out = string_out.replaceAll("•", "·");

(「¬ï」は、UTF-8・が拡張ASCIIとして表示される方法です。この行に出くわす前に、「\ uAC8B」や他の多くのエンコーディングを試しましたが、成功しませんでした。)

この行はUTF-8ミッドドットを切り取りますが、それを置き換えるものではなく、半分の時間しか行いません。残りの半分の時間はキャラクターを見逃し、変更されません。複数のコピーを作成したり、他の行を移動したりしても、それは実行されません。

これはマルチスレッドの問題のように感じますが、マルチスレッドが発生していることに気づいていません。別の.jspから実行されているインクルードされた.jspファイル内のreplaceAllsのブロックのみ。

何がこの競合状態のような行動を引き起こす可能性がありますか?

4

1 に答える 1

4

AC8Bはドットではなく、漢字です。00B7のことですか?

Java文字列は常にUTF-16Unicodeです。UTF-8は、ファイル内のUnicode文字を表す方法であり、Java文字列をメモリに格納する方法ではありません。

入力ファイルの読み取りと出力ファイルの書き込みに使用されるエンコーディングに注意してください。UTF-8である必要がありますが、ファイルの内容がJava文字列に読み込まれると、UTF-8ではなく16ビットになります。 Unicode。

UTF-8の生のバイトをASCIIとして表現しようとするのではなく、正しいUnicodeエスケープを使用するのが最善のチャンスだと思います。

于 2012-01-04T19:37:11.800 に答える