我使用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出了什么问题。有人可以建议修复吗?
- 编辑 -
这是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?非常感谢!
答案 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){...}