【问题标题】:Specify character encoding for query strings with Orbeon使用 Orbeon 为查询字符串指定字符编码
【发布时间】:2012-09-13 18:05:22
【问题描述】:

我们在读取 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

我们的应用程序模型使用oxf:request 处理器读取查询字符串,然后在视图中显示该字符串。在上面的第一种情况下,应用程序正确显示“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

错误是在撇号的多字节编码的第二个字节中引用%80。请注意,在日志中不仅主题会引发异常,而且 xforms 检查器也会引发异常。

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

  1. 在使用 oxf:request 读取时,有没有办法指定查询字符串的编码?我没有看到处理器的配置属性,也没有在 properties-local.xml 中看到可以设置默认值的任何相关内容。
  2. 如果没有,有没有办法强制对字符串进行关联编码?我怀疑这可以通过 XSLT 完成,但找不到示例。我相信我想要的东西相当于 ruby​​ 的String#force_encoding
  3. 如果没有,是否有任何其他建议的方法来解决该错误?我目前最坏情况的 hack-fix 是在它到达 servlet 之前使用 mod_rewrite 去除任何有问题的字符。

感谢任何指导和帮助!

(在http://mail-archive.ow2.org/ops-users/2012-09/msg00033.html 交叉发布到操作用户邮件列表)

【问题讨论】:

  • 对于它的价值,RFC 3987 指定对于 IRI,百分比编码应该表示字符的 UTF-8 形式,因此您的外部应用程序至少在做一件看似合理的事情。然而,在RFC 3986 之前,URI 的定义并没有详细说明非ASCII 数据应该使用什么字符编码。在实践中,软件经常使用 HTML 页面编码或 HTTP 标头来猜测。使用 oxf:request 找出 accept-charset 标头的内容。你能重新配置请求者吗?

标签: character-encoding url-encoding orbeon xforms


【解决方案1】:

Orbeon Forms 依赖于 servlet API 返回的内容:请参阅 getParameterMap() in ServletExternalContext。所以这似乎是您需要在应用程序服务器级别设置的东西;如果使用 Tomcat,您可以通过 adding URIEncoding="UTF-8" on the <Connector> 进行操作。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2016-07-28
  • 2012-03-25
相关资源
最近更新 更多