返回带问号的中文 Orbeon 表格
Orbeon form in chinese returned with question marks
我在 Tomcat 7.0 上的 SAP Commerce (Hybris) 中使用 ORBEON 2018.2.3.201905172253 PE。当 Hybris 使用 Orbeon 应用程序创建新表单并获取中文内联 HTML 时,我得到的是问号而不是中文字符。
URL: http://localhost:9001/orbeon/fr/yforms/myform/new?orbeon-embeddable=true&fr-language=zh-Hans
方法:获取
Headers:
[
{
"key":"hybris-Username",
"value":"-"
},
{
"key":"hybris-Group",
"value":"-"
},
{
"key":"hybris-Roles",
"value":"-"
},
{
"key":"Orbeon-Client",
"value":"portlet"
},
{
"key":"hybris-Proxy-09e4ff02-4715-4547-8f81-30082598eec9",
"value":“37bb0017-2675-4617-945d-6693bdae8eb9”
},
{
"key":"Content-Type",
"value":"text/html;charset=UTF-8"
}
]
我发现 Tomcat 7 中有一个关于汉字的已知问题:
显然,Orbeon 包含一种使用 web.xml 文件中的 oxf.xforms.renderer.default-encoding 参数将字符编码设置为 UTF-8 的方法:
https://doc.orbeon.com/xforms/filter
我已经在 web.xml 中尝试过,并从 Orbeon 应用程序中获得了相同的结果。我什至使用 Postman 执行了相同的请求来检查它是否是我的 Hybris 店面的集成问题,但结果是一样的。
这是我的摘录 web.xml:
<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>
将过滤器的 url-pattern 更改为“/orbeon/fr/yforms/*” 破坏了整个事情,我什至无法用英文呈现表格。
在 Java 中调试请求时,我尝试将 HttpRequest object 的字符编码设置为 UTF-8。相同的结果。
我也试过这些,但效果不佳:
• Set the URIEncoding attribute on the element in server.xml to URIEncoding="UTF-8".
• Set the useBodyEncodingForURI attribute on the element in server.xml to true.
与此相关:
该主题的答案解释了我如何本地化我的表单。
最奇怪的是 URL 的响应确实包含一些中文字符:下拉语言选择器的标签。所有其他标签都是问号。超级奇怪!
我想知道如何通过更改我的 Tomat 配置或我的 Orbeon 应用程序配置来解决此问题。
谢谢,
大卫
好吧,正如预期的那样,这个问题与 Orbeon 无关。
在我的 Spring 控制器中,从数据库中获取表单的方法使用 @ResponseBody 进行了注释。 Controller 返回的 String 处于完美状态,包含正确的中文字符,但响应对象随后被 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 的消息转换器处理。默认转换器列于此处:https://www.baeldung.com/spring-httpmessageconverter-rest
其中一个转换器是神奇的 StringHttpMessageConverter。如果你查看它的源代码,你可以看到它使用 ISO-8859-1 作为默认字符集。这些转换器处理的每个响应都将使用不支持中文字符的 ISO-8859-1 进行编码。
修复:
在我的网站 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(支持汉字)作为默认编码。
瞧瞧
我在 Tomcat 7.0 上的 SAP Commerce (Hybris) 中使用 ORBEON 2018.2.3.201905172253 PE。当 Hybris 使用 Orbeon 应用程序创建新表单并获取中文内联 HTML 时,我得到的是问号而不是中文字符。
URL: http://localhost:9001/orbeon/fr/yforms/myform/new?orbeon-embeddable=true&fr-language=zh-Hans 方法:获取 Headers: [ { "key":"hybris-Username", "value":"-" }, { "key":"hybris-Group", "value":"-" }, { "key":"hybris-Roles", "value":"-" }, { "key":"Orbeon-Client", "value":"portlet" }, { "key":"hybris-Proxy-09e4ff02-4715-4547-8f81-30082598eec9", "value":“37bb0017-2675-4617-945d-6693bdae8eb9” }, { "key":"Content-Type", "value":"text/html;charset=UTF-8" } ]
我发现 Tomcat 7 中有一个关于汉字的已知问题:
显然,Orbeon 包含一种使用 web.xml 文件中的 oxf.xforms.renderer.default-encoding 参数将字符编码设置为 UTF-8 的方法:
https://doc.orbeon.com/xforms/filter
我已经在 web.xml 中尝试过,并从 Orbeon 应用程序中获得了相同的结果。我什至使用 Postman 执行了相同的请求来检查它是否是我的 Hybris 店面的集成问题,但结果是一样的。
这是我的摘录 web.xml:
<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>
将过滤器的 url-pattern 更改为“/orbeon/fr/yforms/*” 破坏了整个事情,我什至无法用英文呈现表格。
在 Java 中调试请求时,我尝试将 HttpRequest object 的字符编码设置为 UTF-8。相同的结果。
我也试过这些,但效果不佳:
• Set the URIEncoding attribute on the element in server.xml to URIEncoding="UTF-8".
• Set the useBodyEncodingForURI attribute on the element in server.xml to true.
与此相关:
该主题的答案解释了我如何本地化我的表单。
最奇怪的是 URL 的响应确实包含一些中文字符:下拉语言选择器的标签。所有其他标签都是问号。超级奇怪!
我想知道如何通过更改我的 Tomat 配置或我的 Orbeon 应用程序配置来解决此问题。
谢谢,
大卫
好吧,正如预期的那样,这个问题与 Orbeon 无关。
在我的 Spring 控制器中,从数据库中获取表单的方法使用 @ResponseBody 进行了注释。 Controller 返回的 String 处于完美状态,包含正确的中文字符,但响应对象随后被 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 的消息转换器处理。默认转换器列于此处:https://www.baeldung.com/spring-httpmessageconverter-rest
其中一个转换器是神奇的 StringHttpMessageConverter。如果你查看它的源代码,你可以看到它使用 ISO-8859-1 作为默认字符集。这些转换器处理的每个响应都将使用不支持中文字符的 ISO-8859-1 进行编码。
修复:
在我的网站 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(支持汉字)作为默认编码。
瞧瞧