在使用rails的webrick過程中碰到中文url問題,原本認為很簡單的事情其實並不簡單。為了了解中文路徑問題,特別在apache,iis下面做了試驗。過程如下:
首先要準備好gb2312和utf-8的檔名。這裡使用python來獲得。
>>> s_gb='我.txt'
>>> print s_gb
我.txt
>>> s_gb
'/xce/xd2.txt'
>>> s_unicode = s_gb.decode('gb2312')
>>> s_unicode
u'/u6211.txt'
>>> s_utf8 = s_unicode.encode('utf-8')
>>> s_utf8
'/xe6/x88/x91.txt'
>>> rs_gb=r'/xce/xd2.txt'
>>> rs_gb
'//xce//xd2.txt'
>>> rs_gb.replace('//x','%')
'%ce%d2.txt'
>>> rs_utf8 = r'/xe6/x88/x91.txt'
>>> rs_utf8.replace("//x","%")
'%e6%88%91.txt'
好了,到此為止已經獲得了"我.txt"用不同的編碼encode之後的名稱,分別是'%ce%d2.txt'(gb2312)和'%e6%88%91.txt'(utf-8)。
現在將'我.txt'放置到web伺服器上去,比如說是web的根目錄下面。然後分別通過http://localhost/%ce%d2.txt和http://localhost/%e6%88%91.txt去訪問。
一、iis伺服器。
兩種方法都可以訪問。由此可見iis伺服器具有某種識別機制,做出正確的選擇。
二、apache伺服器
用utf-8編碼可以訪問,用gb2312不可以訪問。這個結果出乎我的意料,毫無疑問檔案系統上的"我.txt"名稱是以gb2312編碼的,反而用utf-8可以訪問?也許apache為了適應各種各樣的平台,而有它的特殊考慮。這個apache伺服器只是在我的windows2000伺服器上測試,沒有在linux獲其它系統下測試,不過要測試也很簡單。
三、rails的webrick
webrick就很簡單了,你必須和檔案系統上檔名的編碼一致。用下面的python**可以在檔案系統上建立乙個以utf-8編碼檔名的'她的.txt',當然如果你用windows資源管理器去檢視的話會是亂碼。
>>> s='她的.txt'
>>> su=s.decode('gb2312').encode('utf-8')
>>> su
'/xe5/xa5/xb9/xe7/x9a/x84.txt'
>>> f = open("c:///xe5/xa5/xb9/xe7/x9a/x84.txt",'w')
>>> f.write('abc')
>>> f.close()
然後將這個檔案放置到webrick的根目錄下面,通過http://localhost/%e5%a5%b9%e7%9a%84.txt就可以訪問。
這個例子當中需要注意的是,作業系統不總是允許你用不同的編碼用作檔名,比如你用'她.txt'就不行。
通過這些測試之後,應該知道只有將中文檔名的檔案在iis下面,才能保證任何情況下都能正常訪問。
這裡的任何情況包括:
通過您自己的站點
別人將連線放在別人的**上。
第一種情況下,三種伺服器都可以做到。比如,對於apache伺服器,只要將有中文連線的頁面都設定成utf-8編碼,而檔案系統上的檔名是gb2312編碼即可。而對於webrick,只要將頁面設定成gb2312,檔案系統名也是gb2312即可。真的嗎?其實有例外,比如用ie來訪問,並且ie設定成總是以utf-8傳送的話。但是webrick可以將頁面設定成utf-8,然後將檔名也設定成utf-8即可。但這前提是檔案系統必須是utf-8編碼檔名,比如novell的sles(這個我知道,其它的不知道)等。
在第二種情況下,你無法控制別人的**用什麼編碼顯示,所以iis是唯一的選擇。
url中文編碼問題
1.url該編碼的編碼一定要編碼,否則如果存在空格就會報400錯誤,那麼什麼樣的url是該編碼的呢?url中有空格等特殊字元的 url中有中文的2.編碼要只對引數編碼,不要對整個url進行編碼,因為如果對整個url編碼的話會把url中的 等字元也進行編碼了 3.使用urlencoder.encode...
php中文路徑問題
所有面頁,包括空白的都會報類似下面的錯誤。warning unknown failed to open stream no such file or directory in unknown on line 0 fatal error unknown failed opening required ...
Python 中文路徑問題
python中檔案路徑的問題 慎用中文路徑!慎重中文路徑!慎用中文路徑!使用斜槓 c test.txt 不用反斜槓就沒法產生歧義了 將反斜槓符號轉義 c test.txt 因為反斜槓是轉義符,所以兩個 就表示乙個反斜槓符號 使用python的raw string r c test.txt pytho...