2012-09-13 54 views
2

在读取UTF-8查询字符串时遇到字符编码问题。一个独立的外部应用程序构建链接到我们的Orbeon应用程序,如:使用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. 如果没有,是否有其他建议的方法来解决错误?我目前最糟糕的黑客修复方法是在使用mod_rewrite访问servlet之前去掉任何违规字符。

任何指导和帮助表示赞赏!

(交叉张贴到OPS用户在http://mail-archive.ow2.org/ops-users/2012-09/msg00033.html邮件列表)

+0

[RFC 3987](http://www.ietf.org/rfc/rfc3987.txt)指定对于IRI,百分号编码应该表示字符的UTF-8格式,所以你的外部应用程序至少在做一件似是而非的事情。然而,在[RFC 3986](http://www.ietf.org/rfc/rfc3986.txt)之前,URI的定义并未详细指定应对非ASCII数据使用何种字符编码。实际上,软件通常使用HTML页面编码或HTTP标头进行猜测。使用oxf:request来找出'accept-charset'头文件的内容。你能重新配置请求者吗? –

回答

3

Orbeon形式依赖于什么是由servlet API返回:看getParameterMap() in ServletExternalContext。所以这似乎是你需要在应用服务器级别设置的东西;如果使用Tomcat,则可以通过adding URIEncoding="UTF-8" on the <Connector>来完成。

+0

在tomcat的“server/conf.xml”中添加'URIEncoding'属性解决了这个问题,就像'useBodyEncodingForURI'属性一样。这两个值都记录在http://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html,并在http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q2 –