我正在使用apache http client 4进行所有网络访问。 这意味着我需要做的每个查询都必须通过URI语法检查。 我尝试访问的其中一个站点使用UNICODE作为URL GET参数编码,即:
(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
答案 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版本没有。哦,亲爱的!