【问题标题】:javax.xml.transform.TransformerFactory Unicode issue- Javajavax.xml.transform.TransformerFactory Unicode 问题 - Java
【发布时间】:2017-02-22 10:32:19
【问题描述】:

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

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

【问题讨论】:

  • 这里缺少代码。你有一个else,但没有if,一个try,但没有catch。如果您将输出写入String,我很确定输出编码是无关紧要的。您如何观察编码问题?
  • 我已经更新了代码,你可以检查n让我知道
  • 谢谢你,但你还没有回答我的问题。你怎么看结果?你是把它写到文件里吗?到控制台?你在调试器中查看它吗?
  • 将其写入文件..它没有正确写入..然后我调试了代码...transformer.transform(new StreamSource( new ByteArrayInputStream(SXmlFileData.getBytes("UTF8"))),结果);在这段代码之后,它将 unicode 字符转换为其他字符
  • 您将其写入文件的代码在哪里?它不在这里。

标签: java xml unicode transform


【解决方案1】:

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

这告诉您,在这个过程的某个地方,UTF-8 格式的数据正在被一个认为它正在读取 Latin-1 的软件读取。它没有告诉你的是在这个过程中发生了什么。所以你需要分而治之——你需要找到数据正确的最后一点。

首先确定问题是在转换之前还是之后。如果您使用的是 XSLT 2.0 处理器,这将非常容易:您可以使用 ` 查看 XSLT 处理器已经给出了哪些字符串。使用 1.0 处理器有点棘手,但您可以使用 substring($in, $n, 1) 来提取第 n 个字符,这应该会给您一个线索。

我怀疑是输入。首先,将非 ASCII 字符放在 Java 字符串文字中总是有点危险,因为如果您对正确配置的所有内容都不太小心,那么往返源存储库很容易损坏代码。其次,如果字符串是正确的,使用 StringReader 读取它会更安全,而不是将其转换为字节流。试试:

transformer.transform(new StreamSource(
          new StringReader(SXmlFileData)),outResult);

【讨论】:

  • 当我调试代码时,我能够正确地看到 SXmlFileData 中的字符。在 SXmlFileData.getBytes("UTF-8") 之后,我收集了 ByteArray 并转换回原始字符串.. 它能够返回原始字符.. 之后我无法调试
猜你喜欢
  • 1970-01-01
  • 2013-07-23
  • 2013-01-27
  • 2016-07-29
  • 2012-02-23
  • 1970-01-01
  • 2023-04-10
  • 2010-12-26
  • 2011-11-09
相关资源
最近更新 更多