2010-02-17 70 views
1

我正在使用apache http client 4進行所有網頁訪問。 這意味着我需要做的每個查詢都必須通過URI語法檢查。 一個我試圖訪問的網站採用UNICODE爲URL GET PARAMS編碼,即:在UNICODE中爲apache httpclient 4 URI編碼

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=

(帕拉姆 「srh_txt =%u05E0%u05D9%u05D1」 編碼srh_txt =ניב在UNICODE )

問題是URI不支持UNICODE編碼(它只支持UTF-8) 這裏真的很大的問題是,這個網站期望它的參數是以UNICODE編碼的,所以任何嘗試轉換URL使用String.format(「http://...srh_txt=%s& ...」,URLEncoder.encode(「ניב」,「UTF8」)) 產生一個url,這是合法的,可以是你sed構造一個URI,但是由於它不是它所期望的編碼,所以該站點對它的響應是一個錯誤消息。

通過這種方式可以創建URL對象,甚至可以使用未轉換的URL來連接到網站。 有什麼辦法在非UTF-8編碼中創建URI? 是否有任何方式與常規URL(而不是URI)與Apache HTTPClient 4?

感謝, 和合

回答

1

(帕拉姆 「srh_txt =%u05E0%u05D9%u05D1」 編碼srh_txt =ניב在UNICODE)

它並不真正的。這不是URL編碼,並且在URL中的序列%u無效

%u05E0%u05D9%u05D1"僅在JavaScript的奇怪球形escape語法中編碼ניבescape與除+之外的所有ASCII字符的URL編碼相同,但它爲Unicode字符生成的%u####轉義符完全是它自己的發明。

(單應,在一般情況下,從不使用escape。使用encodeURIComponent代替產生正確的URL編碼UTF-8,ניב = %D7%A0%D7%99%D7%91。)

如果網站需要在其查詢字符串%u####序列,它非常糟糕。

有什麼辦法在非UTF-8編碼中創建URI?

是的,URIs可以使用任何你喜歡的字符編碼。它通常是UTF-8;這是IRI要求的,如果用戶在地址欄中輸入非ASCII字符,那麼通常會提交,但URI本身只關心字節。所以你可以將ניב轉換爲%F0%E9%E1。 Web應用程序沒有辦法知道這些字節代表用代碼頁1255編碼的字符(希伯來語,類似於ISO-8859-8)。但它似乎工作,在上面的鏈接,UTF-8版本沒有。噢親愛的!

+0

非常感謝您的回答 我在我的代碼中運行了一個url列表,並且有時會得到URISyntaxExceptions並試圖找到解決其中一些問題的方法(最後一篇文章中的例外只是其中的一個url該列表) 我認爲這個問題將被視爲代碼中的「無法解決問題」(但不會花費大量時間) 我將繼續進行下一步。 再次感謝 Niv – Niv 2010-02-17 15:25:14