1

mojibakes が含まれている xml タグであった文字列があります。
<Applicant_Place_Born>Ð&#156;оÑ&#129;ква</Applicant_Place_Born>

まったく同じ文字列ですが、正しいエンコーディングは次のとおりです。
<Applicant_Place_Born>Москва</Applicant_Place_Born>

これは、Tcl ユーティリティを使用して適切な文字列に変換できるためです。

# The original string
set s "Ð&#156;оÑ&#129;ква"
# substituting the html escapes
set t "Ð\x9cоÑ\x81ква"
# decode from utf-8 into Unicode
encoding convertfrom utf-8 "Ð\x9cоÑ\x81ква"
Москва

これのさまざまなバリエーションを試しました:

System.out.println(new String(original.getBytes("UTF-8"), "CP1251"));

しかし、文字の代わりに他の文字化けやクエスチョン マークが常に表示されます。

Q: Java コードを使用して、Tcl と同じことを行うにはどうすればよいですか?

編集:

@Joop Eggenのアプローチを試しました:

import org.apache.commons.lang3.StringEscapeUtils;


public class s {
    static String s;
    public static void main(String[] args) {
        try {
            System.setProperty("file.encoding", "CP1251");
            System.out.println("JVM encoding: " + System.getProperty("file.encoding"));
            s = "Ð&#156;оÑ&#129;ква";
            System.out.println("Original text: " + s);

            s = StringEscapeUtils.unescapeHtml4(s);
            byte[] b = s.getBytes(StandardCharsets.ISO_8859_1);
            s = new String(b, "UTF-16BE");

            System.out.println("Result: " + s);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

変換された文字列は中国語でした:

JVM encoding: CP1251 Original text: Ð&#156;оÑ&#129;ква Result: 킜킾톁킺킲킰

4

2 に答える 2

2

Java の文字列は、常に正しい Unicode である必要があります。あなたの場合、UTF16BE がシングルバイトエンコーディングとして解釈されているようです。

パッチは

String string = new StringEscapeUtils().UnescapeHTML4(s);
byte[] b = string.getBytes(StandardCharsets.ISO_8859_1);
string = new String(b, "UTF-16BE");

これsで、正しい Unicode 文字列になるはずです。

System.out.println(s);

たとえば、オペレーティング システムが Cp1251 の場合、キリル文字は正しく変換されます。

  • s の文字は、実際にはUTF-16BEのバイトだと思います
  • 文字列のバイトをシングルバイトエンコーディングで取得することにより、うまくいけば変換は行われません
  • 次に、バイトの文字列を UTF-16BE として作成し、内部で Unicode に変換します (実際には UTF-16BE も)
于 2015-07-02T13:55:34.640 に答える
1

あなたはかなり近かった。ただし、デコードではなく UTF-8 のエンコードgetBytesに使用されます。あなたが望むのは、

String string = "Ð\x9cоÑ\x81ква";
byte[] bytes = string.getBytes("UTF-8");
System.out.println(new String(bytes, "UTF-8"));
于 2015-07-02T13:55:25.443 に答える