1

コードポイントを保持するために XML エスケープが可能であるため、これは上記の質問とは異なることに注意してください。

HTTP 経由で制御できない他のシステムに送信できる UTF-8 XML ファイルがあります。なんらかのクレイジーな理由で、多くの Unicode 文字を失い、それらを「?」に置き換える ISO-8859-1 に変換することにしました。このシステムは、この変換された XML ドキュメントを別の人に送信します。

送信側の Java で、非 ASCII コードポイントを持つ任意の XML をエスケープして、この中間システムを生き延び、エンドポイントで正しくデコードできるようにするにはどうすればよいですか?

A --(UTF-8)--> B --(ISO-8859-1)--> C (内部 Unicode 表現にデコード)。

import java.text.Normalizer;
import java.text.Normalizer.Form;

import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.text.translate.CharSequenceTranslator;
import org.apache.commons.lang3.text.translate.NumericEntityEscaper;

public class Test {
    private static CharSequenceTranslator translator = StringEscapeUtils.ESCAPE_XML
            .with(NumericEntityEscaper.between(0x7f, Integer.MAX_VALUE));

    public static void main(String[] args) {
        String s = "<note>\n<to>Tove</to>\n<from>Jani</from>\n<heading>Reminder</heading>\n<body>Don't forget me this weekend!test☠ä</body>\n</note>";
        String xmlEscapedS = xmlToRobustXml(s);
        System.out.println(xmlEscapedS);
    }

    /**
     * @param s
     * @return
     */
    public static String xmlToRobustXml(String s) {
        s = Normalizer.normalize(s, Form.NFC);
        String xmlEscapedS = translator.translate(s);
        return xmlEscapedS;
    }
}

私はこれを試しましたが、すべてをエスケープします。

&lt;note&gt;
&lt;to&gt;Tove&lt;/to&gt;
&lt;from&gt;Jani&lt;/from&gt;
&lt;heading&gt;Reminder&lt;/heading&gt;
&lt;body&gt;Don&apos;t forget me this weekend!test&#9760;&#228;&lt;/body&gt;
&lt;/note&gt;
4

2 に答える 2

0

127 を超える Unicode コード ポイント&#123;は、次のように数値エンティティとしてエンコードできます。

Apache commons StringEscapeUtilsから。デフォルトでescapeXMLは数値エンティティに変換されません。

StringEscapeUtils.ESCAPE_XML
    .with(NumericEntityEscaper.between(0x7f, Integer.MAX_VALUE));

ところで、ヘッダーを使用して元の XML を送信しようとするContent-Type: application/x-xmlので、バイナリ転送を行います。

于 2013-05-22T21:23:02.480 に答える