用于apache httpclient 4的UNICODE中的URI编码

时间:2010-02-17 13:14:21

标签: java encoding uri httpclient

我正在使用apache http client 4进行所有网络访问。 这意味着我需要做的每个查询都必须通过URI语法检查。 我尝试访问的其中一个站点使用UNICODE作为URL GET参数编码,即:

http://maya.tase.co.il/bursa/index.asp?http://maya.tase.co.il/bursa/index.asp?view=search&company_group=147&srh_txt=%u05E0%u05D9%u05D1&arg_comp=&srh_from=2009-06-01&srh_until=2010-02-16&srh_anaf=-1&srh_event=9999&is_urgent=0&srh_company_press=

(param“srh_txt =%u05E0%u05D9%u05D1”在UNICODE中编码srh_txt =ניב)

问题是URI不支持UNICODE编码(它只支持UTF-8) 这里真正重要的问题是,这个站点期望它的params在UNICODE中编码,因此任何尝试使用String.format(“http://...srh_txt=%s& ...”,URLEncoder.encode(“ניב”, “UTF8”)) 结果是一个合法的url,可以用来构造一个URI但是站点对它的响应带有错误信息,因为它不是它所期望的编码。

顺便说一下,URL对象可以创建甚至用于使用未转换的URL连接到网站。 有没有办法用非UTF-8编码创建URI? 有没有办法使用常规URL(而不是URI)使用apache httpclient 4?

感谢, NIV

1 个答案:

答案 0 :(得分:1)

  

(param“srh_txt =%u05E0%u05D9%u05D1”在UNICODE中编码srh_txt =ניב)

它并不是真的。这不是网址编码,网址中的序列%u 无效

%u05E0%u05D9%u05D1"仅在JavaScript的古怪ניב语法中对escape进行编码。 escape与除+之外的所有ASCII字符的URL编码相同,但它为Unicode字符生成的%u####转义完全属于其自身的发明。

(一般情况下,应该永远不要使用escape。使用encodeURIComponent代替生成正确的网址编码的UTF-8,ניב = %D7%A0%D7%99%D7%91。)

如果某个网站在其查询字符串中需要 %u####个序列,那么它就会被严重破坏。

  

有没有办法用非UTF-8编码创建URI?

是的,URI可以使用您喜欢的任何字符编码。它通常是UTF-8;如果用户在地址栏中键入非ASCII字符,则IRI要求的内容以及通常提交的浏览器将提交,但URI本身仅关注字节。

因此,您可以将ניב转换为%F0%E9%E1。 Web应用程序无法告诉那些字节表示在代码页1255中编码的字符(希伯来语,类似于ISO-8859-8)。但它似乎在上面的链接上工作,UTF-8版本没有。哦,亲爱的!