javax.xml.transform.TransformerFactory Unicode问题 - Java

时间:2017-02-22 10:32:19

标签: java xml unicode transform

我们无法正确转换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;
    }

这是输出我得到ã,ãƒ?ãƒãã,ュ代替ガネーシュ

1 个答案:

答案 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);