我们无法正确转换Unicode字符。我们以XML格式提供输入,当我们尝试转换时,我们无法取回原始字符串。
这是我正在使用的代码,
StringCarrier OStringCarrier = new StringCarrier();
String SXmlFileData= "<export_candidate_response><criteria><output><lastname>Bhagavath</lastname><firstname>ガネーシュ</firstname></output></export_candidate_response>";
String SResult = "";
try
{
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource(SXslFileName));
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF8");
OutputStream xmlResult = (OutputStream)new ByteArrayOutputStream();
StreamResult outResult = new StreamResult(xmlResult);
transformer.transform(new StreamSource(
new ByteArrayInputStream(SXmlFileData.getBytes("UTF8"))),outResult);
SResult = outResult.getOutputStream().toString();
}
catch (TransformerConfigurationException OException)
{
//Exception has been thrown
OException.printStackTrace();
return OStringCarrier;
}
catch (TransformerException OException)
{
//Exception has been thrown
OException.printStackTrace();
return OStringCarrier;
}
catch (Exception OException)
{
//Exception has been thrown
OException.printStackTrace();
return OStringCarrier;
}
这是输出我得到ã,ãƒ?ãƒãã,ュ代替ガネーシュ
答案 0 :(得分:1)
这是输出我得到ã,ãƒ?ãƒãã,ュ代替ガネーシュ
这告诉你,在这个过程的某个地方,UTF-8中的数据正被一个认为它正在读取Latin-1的软件读取。它没有告诉你的是在这个过程中发生了什么。所以你需要分而治之 - 你需要找到数据正确的最后一点。
首先确定问题是在转换之前还是之后。如果您使用的是XSLT 2.0处理器,那将非常容易:您可以使用`查看XSLT处理器给出的字符串。使用1.0处理器有点棘手,但你可以使用子字符串($ in,$ n,1)来提取第n个字符,这应该会给你一个线索。
我怀疑这是输入。首先,将非ASCII字符放在Java字符串文字中总是有点危险,因为如果您对正确配置的所有内容都不是非常小心的话,往返源代码库的往返很容易破坏代码。其次,如果字符串是正确的,使用StringReader读取它会更安全,而不是将其转换为字节流。尝试:
transformer.transform(new StreamSource(
new StringReader(SXmlFileData)),outResult);