XML UTF-8输出中的编码错误

时间:2014-07-21 19:27:59

标签: xml utf-8 spring-data-rest

我使用Spring Data REST生成UTF-8 XML。我正在注释返回XML的方法如下:

 @RequestMapping(value = "/Something/{id:.+}",
       method = RequestMethod.GET,
       produces = "application/xml")
public @ResponseBody String metsResource(@PathVariable String id){...}

我的程序使用来自各种API的一些数据生成XML。我在一些API中注意到,数据有版权符号。当我创建我的XML并检查它时,它生成正常但浏览器(尝试使用Chrome& Safari)无法呈现XML。我收到以下错误。当我从控制台复制XML输出时,我可以看到错误位置在版权符号附近。当输入包含版权符号时,我不确定我的XML出了什么问题。有人可以建议修复吗?

Browser Returned Error

- 编辑 -

这是XML的一大块。如果您在元素accessCondition中看到,您会注意到版权符号。这正是浏览器停止渲染的地方。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<data>
<hdr CREATEDATE="2014-07-21T12:40:09"/>
<sec ID="123456">
 <xmlData>
   <titleInfo>
    <title script="Latn">A book</title>
    <subTitle>Indian stories</subTitle>
   </titleInfo>
   <name>
    <namePart>Jane Doe</namePart>
    <role>Creator</role>
   </name>
   <originInfo>
    <publisher script="Latn"> ABCD Press</publisher>
    <place> Connecticut</place>
    <dateOther encoding="w3cdtf" keyDate="yes">2009</dateOther>
   </originInfo>
   <language>
    <languageTerm type="code">eng</languageTerm>
    <languageTerm type="text">English</languageTerm>
   </language>
   <abstract>A book with lot of Red Indian Stories.</abstract>
   <identifier type="hdl">123456</identifier>
   <location>
    <physicalLocation>N7433.4 L44 A88 2009</physicalLocation>
   </location>
   <accessCondition type="rightsOwnership">© 2009 Jane Doe - ABCD Press, Connecticut</accessCondition>
   <recordInfo>Test</recordInfo>
  </xmlData>
 </sec>
</data>   

生成完整XML的代码库非常庞大,因此很难在此处显示。但是在返回XML之前,程序将ByteArrayOutputStream(本例中为变量'out')转换为UTF-8

String xml = out.toString("UTF-8");

就像Jim Garrison在评论中所建议的那样,输入中的©符号似乎是ISO-8859-1编码。原因:当我将ByteArrayOutputStream的上述转换更改为以下内容时,XML开始显示。

String xml = out.toString("ISO-8859-1"); 

有没有办法让输出为UTF-8?非常感谢!

1 个答案:

答案 0 :(得分:2)

由于我经过大量的打击和试验后自己解决了这个问题,所以我发布了这个答案。遇到与我相同问题的人可能会幸免受到打击和审判。首先,我确保我收到的输入数据是UTF-8。一旦确认,我试图在控制台中输出生成的XML。这也返回了UTF-8数据(至少版权没有出现'?')。只有当我使用curl调用REST API或使用浏览器呈现REST API的输出时,我才得到不正确的编码。我阅读了Spring Data Rest文档,在一个例子中,有人建议我指定我想要返回的字符集。由于XML始终是UTF-8,因此不必提及charset,但由于我没有从API获得正确的UTF-8格式XML,因此我指定了charset。这对我有用。这是怎么做的。

@RequestMapping(value = "/Something/{id:.+}",
   method = RequestMethod.GET,
   produces = "application/xml;charset=utf-8")
public @ResponseBody String metsResource(@PathVariable String id){...}