在resin中,如果在firefox浏览器中直接在地址栏访问比如 “ http://xxxx.com/tag/中文 ” 这样的url,resin会报错:
400 Bad Request The URL contains escaped bytes unsupported by the utf-8 encoding.
把resin中的相关代码UTF8Reader.java翻出来调了半天,总算明白了。
在firefox中,直接在地址栏访问带中文的url,firefox会以GBK编码方式发送到服务器端,因此变成了 " http://xxxx.com/tag/%D6%D0%CE%C4 " 这样的url,因为这个只是GBK编码,resin默认为UTF-8编码,这个肯定不对了。而在ie中,一般的默认设置都是以UTF8方式发送url,因此url会变成正确 " http://xxxx.com/tag/%E4%B8%AD%E6%96%87 ",后面的这些字符就是“中文”对应的UTF8的二进制编码。有意思的是,如果通过网页点击这种中文连接firefox也会按照UTF8方式发送,此时也是正确的。
因此在我们项目中, 可以不考虑firefox直接输入中文url的情况,而按照统一的utf8处理,在服务器端,通过URLDecoder.decode(URI,"UTF-8")就可以获得解码后的中文url。在resin中redirect一个中文url也需要用URLEncoder.encode(url,"UTF-8")获得utf-8的url,不然也是错误。






