Utf 8 返回带问号的中文Orbeon表单
我正在Tomcat 7.0上使用SAP Commerce(Hybris)中的ORBEON 2018.2.3.201905172253 PE。当Hybris点击Orbeon应用程序创建一个新表单并获得中文的内联HTML时,我得到的是问号而不是中文字符 网址: 方法:获取 标题: [ { “密钥”:“hybris用户名”, “价值”:“-” }, { “密钥”:“hybris集团”, “价值”:“-” }, { “关键”:“hybris角色”, “价值”:“-” }, { “密钥”:“Orbeon客户端”, “值”:“portlet” }, { “键”:“hybris-Proxy-09e4ff02-4715-4547-8f81-30082598eec9”, “值”:“37bb0017-2675-4617-945d-6693bdae8eb9” }, { “键”:“内容类型”, “值”:“text/html;charset=UTF-8” } ] 我发现Tomcat 7中有一个已知的汉字问题: 显然,Orbeon包含了一种使用web.xml文件中的oxf.xforms.renderer.default-encoding参数将字符编码设置为UTF-8的方法: 我已经在我的web.xml中尝试过了,并且从Orbeon应用程序中得到了相同的结果。我甚至使用Postman执行了相同的请求,以检查是否与我的Hybris店面存在集成问题,但结果是相同的 这是my web.xml的摘录:Utf 8 返回带问号的中文Orbeon表单,utf-8,character-encoding,tomcat7,hybris,orbeon,Utf 8,Character Encoding,Tomcat7,Hybris,Orbeon,我正在Tomcat 7.0上使用SAP Commerce(Hybris)中的ORBEON 2018.2.3.201905172253 PE。当Hybris点击Orbeon应用程序创建一个新表单并获得中文的内联HTML时,我得到的是问号而不是中文字符 网址: 方法:获取 标题: [ { “密钥”:“hybris用户名”, “价值”:“-” }, { “密钥”:“hybris集团”, “价值”:“-” }, { “关键”:“hybris角色”, “价值”:“-” }, { “密钥”:“Orbeon客
<filter>
<filter-name>orbeon-xforms-filter</filter-name>
<filter-class>org.orbeon.oxf.servlet.OrbeonXFormsFilter</filter-class>
<!-- Uncomment this for the separate WAR deployment -->
<init-param>
<param-name>oxf.xforms.renderer.context</param-name>
<param-value>/orbeon</param-value>
</init-param>
<init-param>
<param-name>oxf.xforms.renderer.default-encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- End separate WAR deployment -->
</filter>
<filter-mapping>
<filter-name>orbeon-xforms-filter</filter-name>
<url-pattern>/xforms-jsp/*</url-pattern>
<!--Servlet 2.4 configuration allowing the filter to run upon forward in addition to request-->
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
orbeon xforms过滤器
org.orbeon.oxf.servlet.OrbeonXFormsFilter
oxf.xforms.renderer.context
/奥本
oxf.xforms.renderer.default-encoding
UTF-8
orbeon xforms过滤器
/XFormsJSP/*
要求
向前地
将过滤器的url模式更改为“/orbeon/fr/yforms/*”破坏了整个过程,我甚至无法用英语呈现表单
在Java中调试请求时,我尝试将HttpRequest对象的字符编码设置为UTF-8。同样的结果
我也尝试过这些方法,但效果不佳:
•将server.xml中元素的URIEncoding属性设置为URIEncoding=“UTF-8”
•将server.xml中元素的useBodyEncodingForURI属性设置为true
与此相关:
该线程的答案解释了我是如何本地化表单的
最奇怪的是,该URL的响应确实包含一些中文字符:下拉式语言选择器的标签。所有其他标签都是问号。太奇怪了
我想知道如何修改Tomat配置或Orbeon应用程序配置来修复此行为
谢谢
David正如所料,问题与Orbeon无关 在我的Spring控制器中,从数据库获取表单的方法用@ResponseBody注释。控制器返回的字符串处于包含正确汉字的完美状态,但响应对象随后被Spring转换器截获
@RequestMapping(method = RequestMethod.GET, value = ...")
@ResponseBody
public String getFormDefinition(@PathVariable final String aaa, @PathVariable final String aaa,
@RequestParam(value = "document", required = false) final String aaa, final HttpServletResponse response)
throws ServletException, IOException, YFormServiceException
{
return "html content";
}
当有@ResponseBody注释时,响应由Spring的消息转换器处理。此处列出了默认转换器:
其中一个转换器是神奇的StringHttpMessageConverter。如果查看其源代码,可以看到它使用ISO-8859-1作为默认字符集。这些转换器处理的每个响应都将使用不支持汉字的ISO-8859-1进行编码
修复方法:
在我的web spring配置文件中,我添加了:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg index="0" name="defaultCharset" value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
使用register defaults=“false”可以告诉Spring不要使用任何默认转换器,而是使用下面提供的列表。在定义StringHttpMessageConverter时,我指定UTF-8(支持汉字)作为默认编码
好吧,正如所料,这个问题与Orbeon无关 在我的Spring控制器中,从数据库获取表单的方法用@ResponseBody注释。控制器返回的字符串处于包含正确汉字的完美状态,但响应对象随后被Spring转换器截获
@RequestMapping(method = RequestMethod.GET, value = ...")
@ResponseBody
public String getFormDefinition(@PathVariable final String aaa, @PathVariable final String aaa,
@RequestParam(value = "document", required = false) final String aaa, final HttpServletResponse response)
throws ServletException, IOException, YFormServiceException
{
return "html content";
}
当有@ResponseBody注释时,响应由Spring的消息转换器处理。此处列出了默认转换器:
其中一个转换器是神奇的StringHttpMessageConverter。如果查看其源代码,可以看到它使用ISO-8859-1作为默认字符集。这些转换器处理的每个响应都将使用不支持汉字的ISO-8859-1进行编码
修复方法:
在我的web spring配置文件中,我添加了:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg index="0" name="defaultCharset" value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
使用register defaults=“false”可以告诉Spring不要使用任何默认转换器,而是使用下面提供的列表。在定义StringHttpMessageConverter时,我指定UTF-8(支持汉字)作为默认编码
Et voila刚刚意识到Orbeon 2018.2.3与Tomcat 7不兼容。我降级到Orbeon 2017.2.2,但问题仍然是一样的。Orbeon表单始终使用UTF-8。这似乎是yForms特有的。例如,这是可行的:如果某些东西起作用,yForms数据库不支持这些字符会不会有问题?刚刚意识到Orbeon 2018.2.3与Tomcat 7不兼容。我降级到Orbeon 2017.2.2,但问题仍然是一样的。Orbeon表单始终使用UTF-8。这似乎是yForms特有的。例如,这是可行的:如果某些事情可行,yForms数据库不支持这些字符是否会有问题?