6

私は、間違ってエンコードされた (または破損した) 文字列 ( ) を提供している外部 Web サービスを扱っていUTF-8ます。素敵なA帽子()がたくさんあります。ISO LATINWINDOWS-1252UTF-8Â

外部 Web サービスが文字列を保存する方法を明らかに修正できないため、情報が失われます。したがって、私が知っている 100% の翻訳を期待することは不可能です。

しかし、誰かがヒューリスティックな文字マッピング ライブラリを Java で作成したことを期待していました (誰かが A ハットを入力する可能性は低いです)。

そうでない場合は、この人の PHP コードを移植できると思います: https://stackoverflow.com/a/3521340/318174

更新と説明: @VGR のような単純な変換は機能しません。元のバイトがありません。エンドポイントでデータが正しく変換されませんでした (SOAP サーバーgetBytes(/*with out correct encoding*/)が完了したか、データが正しくない形式で保存されている可能性があります)。Java でバイトを文字列に逆変換すると、エンコーディングがどこでも同じでない限り、データは保持されません。ASCIIこれは<->のようなものを考えてみるとわかりやすいですUTF-8。データが失われることはありませんが、混乱することが多いため、Windows-1252またはISO Latinそれははるかに複雑です。これは、これらのエンコーディングが 2 バイトである可能性があり、のサブセットではないためですUTF-8

信じられない場合はgetBytes()、さまざまなエンコーディングを試してみると、データの破損やデータの損失が見られます。

4

1 に答える 1

0

正しくエンコードされていないデータの性質を誤解しているかもしれませんが、そのPHPコードは私にはやり過ぎのようです。個々の文字として渡されたUTF-8バイトがある場合は、次のことを実行できるはずです。

String fix(String s) {
    byte[] bytes = s.getBytes(Charset.forName("windows-1252"));
    return new String(bytes, StandardCharsets.UTF_8);
}
于 2012-12-15T01:14:58.643 に答える