gpt4 book ai didi

java - 在 Java 中的 XML 中保留 ISO-8859-1 到 UTF-8 转换之间的 unicode 代码点

转载 作者:行者123 更新时间:2023-11-30 04:22:29 25 4
gpt4 key购买 nike

请注意,这与上面提到的问题不同,因为可以通过 XML 转义来保留代码点。

我有一个 UTF-8 XML 文件,我可以通过 HTTP 将其发送到我无法控制的其他系统。无论出于什么疯狂的原因,它决定将其转换为 ISO-8859-1,丢失许多 Unicode 字符并用“?”替换它们。然后,该系统将转换后的 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;

最佳答案

以下是生成 ISO-8859-1 编码文档的三种标准 API 方法。

使用StAX API :

// output stream
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
// transcode
StringReader xml = new StringReader("<x>pi: \u03A0</x>");
XMLEventReader reader = XMLInputFactory.newFactory().createXMLEventReader(
xml);
XMLEventWriter writer = XMLOutputFactory.newFactory().createXMLEventWriter(
buffer, "ISO-8859-1");
try {
writer.add(reader);
} finally {
writer.close();
}
// proof
String decoded = new String(buffer.toByteArray(),
Charset.forName("ISO-8859-1"));
System.out.println(decoded);

使用DOM API :

// output stream
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
// create XML DOM
InputSource src = new InputSource(new StringReader("<x>pi: \u03A0</x>"));
Document doc = DocumentBuilderFactory.newInstance()
.newDocumentBuilder()
.parse(src);
// serialize
DOMImplementationLS impl = (DOMImplementationLS) doc.getImplementation();
LSOutput out = impl.createLSOutput();
out.setEncoding("ISO-8859-1");
out.setByteStream(buffer);
impl.createLSSerializer().write(doc, out);
// proof
String decoded = new String(buffer.toByteArray(),
Charset.forName("ISO-8859-1"));
System.out.println(decoded);

使用transform package :

// output stream
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
// transformation
StreamSource src = new StreamSource(new StringReader("<x>pi: \u03A0</x>"));
StreamResult res = new StreamResult(buffer);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
transformer.transform(src, res);
// proof
String decoded = new String(buffer.toByteArray(),
Charset.forName("ISO-8859-1"));
System.out.println(decoded);

您将使用哪个取决于您的用例; StAX API 可能是最高效的。

所有这些示例代码将发出相当于以下内容的文档:

<?xml version="1.0"?><x>pi: &#x3a0;</x>

关于java - 在 Java 中的 XML 中保留 ISO-8859-1 到 UTF-8 转换之间的 unicode 代码点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16701666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com