Character encoding 使用Orbeon为查询字符串指定字符编码

Character encoding 使用Orbeon为查询字符串指定字符编码,character-encoding,url-encoding,orbeon,xforms,Character Encoding,Url Encoding,Orbeon,Xforms,在读取UTF-8查询字符串时,我们遇到了字符编码问题。一个单独的外部应用程序构建到我们的Orbeon应用程序的链接,例如: http://localhost:8080/ops/encoding-test/?message=hello%20world http://localhost:8080/ops/encoding-test/?message=it%E2%80%99s%20a%20message 我们的应用程序模型使用处理器读取查询字符串,然后在视图中显示该字符串。在上面的第一种情况下,应

在读取UTF-8查询字符串时,我们遇到了字符编码问题。一个单独的外部应用程序构建到我们的Orbeon应用程序的链接,例如:

  • http://localhost:8080/ops/encoding-test/?message=hello%20world
  • http://localhost:8080/ops/encoding-test/?message=it%E2%80%99s%20a%20message
我们的应用程序模型使用处理器读取查询字符串,然后在视图中显示该字符串。在上面的第一种情况下,应用程序正确显示“hello world”,没有问题。在第二个测试用例中,
%E2%80%99
是UTF-8撇号的URL编码,并导致应用程序出现以下错误:

2012-09-13 12:21:43,383 ERROR XSLTTransformer  - Error at line 174 of oxf:/config/theme-examples.xsl:
Illegal HTML character: decimal 128
2012-09-13 12:21:43,384 ERROR ProcessorService  - Exception at line 174 of oxf:/config/theme-examples.xsl
; SystemID: oxf:/config/theme-examples.xsl; Line#: 174; Column#: -1
org.orbeon.saxon.trans.XPathException: Illegal HTML character: decimal 128
  • 完整日志输出:
  • 应用程序测试用例来源:-根据orbeon-3.9.1.201202031753-PE编写和测试
错误引用了撇号多字节编码的第二个字节中的
%80
。请注意,在日志中,主题不仅会引发异常,xforms检查器也会引发异常

似乎URL被解码为Latin1而不是UTF-8,因为调试处理器列出了一条带有三个撇号字符的消息。到目前为止,在我的研究中,HTTP似乎没有办法指定查询字符串本身的编码

  • 使用oxf:request读取时,是否有方法指定查询字符串的编码?在properties-local.xml中,我没有看到处理器的配置属性或任何与设置默认值相关的内容
  • 如果没有,是否有办法强制对字符串进行相关编码?我怀疑这可以通过XSLT实现,但找不到一个示例。我想我想要和ruby一样的东西
  • 如果没有,是否有其他建议的方法来解决此错误?我目前最糟糕的黑客修复方法是在它进入servlet之前,使用mod_rewrite删除所有有问题的字符
  • 感谢您的指导和帮助


    (交叉发布到ops用户邮件列表中)

    Orbeon表单依赖于servlet API返回的内容:请参阅。因此,这似乎是您需要在应用服务器级别设置的内容;如果使用Tomcat,您可以这样做。

    为了更好,指定对于IRIs,百分比编码应该表示字符的UTF-8形式,因此您的外部应用程序至少在做一件合理的事情。然而,在此之前,URI的定义没有详细说明非ASCII数据应该使用什么字符编码。在实践中,软件通常使用HTML页面编码或HTTP头进行猜测。使用oxf:request找出
    accept字符集
    标题所说的内容。您可以重新配置请求者吗?在tomcat的
    server/conf.xml
    中添加
    URIEncoding
    属性解决了这个问题,正如
    useBodyEncodingForURI
    属性解决了这个问题。这两个值都记录在中,并包含在中的常见问题解答中