コードポイントを保持するために 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;
}
}
私はこれを試しましたが、すべてをエスケープします。
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!test☠ä</body>
</note>