Обратите внимание, что это не тот же вопрос, что упоминалось выше, так как возможно ускорение XML для сохранения кодовых точек.Сохранять кодировки unicode между преобразованиями ISO-8859-1 и UTF-8 в XML в Java
У меня есть XML-файл UTF-8, который я могу отправить через HTTP в другую систему, в которой я не контролирую. По какой-то сумасшедшей причине он решает преобразовать его в ISO-8859-1, потеряв много символов Unicode и заменив их на «?». Затем эта система отправляет кому-то еще этот преобразованный XML-документ.
Как в Java на отправляющей стороне я могу избежать любого произвольного XML с кодовыми точками без ASCII, чтобы они выдержали эту промежуточную систему и все еще могут быть правильно декодированы конечной точкой?
A - (UTF-8) -> B - (ISO-8859-1) -> C (декодирует внутреннее представление Юникода).
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>
возможный дубликат [Как конвертировать между ISO-8859-1 и UTF-8 в Java?] (Http://stackoverflow.com/questions/652161/how-do-i-convert-between-iso-8859-1-and-utf-8-in-java) –
@PaulVargas Немного отличается в случае XML с xx;. Я не уверен, как это сделать с любой существующей библиотекой XML. –
Не можете ли вы просто отправить ISO-8859-1 закодированный документ? Все кодовые точки вне этого диапазона могут быть экранированы с помощью [ссылок на символы] (http://www.w3.org/TR/REC-xml/#sec-references). – McDowell