2009-08-05 27 views
12

處理字符編碼URI在網站上我想幫助,用戶可以在瀏覽器中鍵入URL,像下面的中國字,在Tomcat

http://localhost:8080?a=測試 

在服務器上,我們得到

GET /a=%E6%B5%8B%E8%AF%95 HTTP/1.1 

正如你所看到的,它是UTF-8編碼,然後是URL編碼。我們可以通過在Tomcat中將編碼設置爲UTF-8來正確處理此問題。

然而,有時我們得到某些瀏覽器latin1編碼,

http://localhost:8080?a=ß 

變成

GET /a=%DF HTTP/1.1 

反正有沒有在Tomcat中正確處理呢?看起來服務器必須做一些聰明的猜測。我們不期望正確處理Latin1,但是通過假定所有內容都是UTF-8,任何事情都比我們現在正在做的更好。

服務器是Tomcat 5.5。支持的瀏覽器是IE 6+,Firefox 2+和iPhone上的Safari。

+0

[在Tomcat中自動檢測URI編碼](http://stackoverflow.com/questions/2657515/detect-the-uri-encoding-automatically-in-tomcat) – Ryan 2012-07-21 00:45:32

回答

5

不幸的是,UTF-8編碼是URI specification中的「應該」,似乎認爲原始服務器將生成所有URL,以便它們對目標服務器有意義。

我會考慮一些技巧;都涉及自己解析查詢字符串(儘管您可能比我更瞭解設置請求編碼是否影響查詢字符串參數映射或僅影響正文)。

首先,檢查單個「高字節」的查詢字符串:有效的UTF-8序列必須有兩個或多個字節(Wikipedia entry有一個有效和無效字節的好表)。

不太可靠的是在請求中查找「Accept-Charset」標頭。我不認爲這個頭文件是必需的(沒有看過HTTP規範來驗證),我知道Firefox至少會發送一個可接受值的整個列表。選擇列表中的第一個值可能會起作用,或者可能不會。

最後,你有沒有對日誌做過任何分析,看看一個特定的用戶代理是否會一致地使用這種編碼?