Nodejs如何處理IE詭異的非英文URL編碼

來源:互聯網
上載者:User
眾所周知URL裡是不能出現除了英文數字和某些特殊符號外的其他字元的,也不能出現漢字。URL會出現漢字也就4種情況:

  1. 網址路徑(path)中包含漢字:如 https://zh.wikipedia.org/wiki/瀏覽器
  2. Get方法產生包含漢字的URL:一般是由表單產生的,比如 https://zh.wikipedia.org/w/index.php?search=%E6%B5%8F%E8%A7%88%E5%99%A8
  3. 查詢字串(Query String)包含漢字:比如 https://zh.wikipedia.org/w/index.php?search=瀏覽器 與第二種不同的是直接在瀏覽器地址欄輸入漢字
  4. Ajax調用的URL包含漢字: 比如

在第一種情況下,各瀏覽器始終使用UTF-8編碼,也就是最後被解析成了 https://zh.wikipedia.org/wiki/%E6%B5%8F%E8%A7%88%E5%99%A8
第二種情況則是根據當前頁面編碼進行轉義,2中的例子用的就是UTF-8
第三種情況就相當詭異了,Chrome和FF都使用UTF-8進行轉義,而IE則不是。查了一下,IE用的是作業系統的預設編碼,據我所知這個預設編碼在不同Windows版本和不同系統語言下都不一樣。
第四種情況和第三類似,IE使用系統預設而Chrome和FF使用UTF-8。

於是乎伺服器拿到第三和第四種的請求後,根本不知道用的是什麼編碼。第四種倒容易解決,提前用JavaScript指定編碼轉義一次就好。但是第三種就...

於是說伺服器如何確定在第三種情況發來的發來的查詢字串真正內容?這裡用的是Nodejs,可以的話也想聽聽PHP的解決方案。

試了一個貌似在IE下,用第三種情況搜尋Wordpress也會返回404(用錯誤解碼方式的關鍵詞查詢資料庫沒有找到結果)。

=============
突然想到一個點子,能不能從請求header的UA判斷是否為IE,如果是再通過Accept-Language來猜測編碼...(我開始亂來了....

回複內容:

眾所周知URL裡是不能出現除了英文數字和某些特殊符號外的其他字元的,也不能出現漢字。URL會出現漢字也就4種情況:

  1. 網址路徑(path)中包含漢字:如 https://zh.wikipedia.org/wiki/瀏覽器
  2. Get方法產生包含漢字的URL:一般是由表單產生的,比如 https://zh.wikipedia.org/w/index.php?search=%E6%B5%8F%E8%A7%88%E5%99%A8
  3. 查詢字串(Query String)包含漢字:比如 https://zh.wikipedia.org/w/index.php?search=瀏覽器 與第二種不同的是直接在瀏覽器地址欄輸入漢字
  4. Ajax調用的URL包含漢字: 比如

在第一種情況下,各瀏覽器始終使用UTF-8編碼,也就是最後被解析成了 https://zh.wikipedia.org/wiki/%E6%B5%8F%E8%A7%88%E5%99%A8
第二種情況則是根據當前頁面編碼進行轉義,2中的例子用的就是UTF-8
第三種情況就相當詭異了,Chrome和FF都使用UTF-8進行轉義,而IE則不是。查了一下,IE用的是作業系統的預設編碼,據我所知這個預設編碼在不同Windows版本和不同系統語言下都不一樣。
第四種情況和第三類似,IE使用系統預設而Chrome和FF使用UTF-8。

於是乎伺服器拿到第三和第四種的請求後,根本不知道用的是什麼編碼。第四種倒容易解決,提前用JavaScript指定編碼轉義一次就好。但是第三種就...

於是說伺服器如何確定在第三種情況發來的發來的查詢字串真正內容?這裡用的是Nodejs,可以的話也想聽聽PHP的解決方案。

試了一個貌似在IE下,用第三種情況搜尋Wordpress也會返回404(用錯誤解碼方式的關鍵詞查詢資料庫沒有找到結果)。

=============
突然想到一個點子,能不能從請求header的UA判斷是否為IE,如果是再通過Accept-Language來猜測編碼...(我開始亂來了....

這個問題和IE沒多大關係...
btw: 你後面提到的 通過Accept-Language來猜測編碼更是不靠譜.
因為這個 要求標頭是 告訴伺服器 瀏覽器支援什麼樣的語言(Language), 與本次提交時參數的編碼沒有任何關係.

你遇到的問題, 主要是後端的編碼識別的問題.

測試代碼:
1.html 文檔聲明內容編碼為 utf-8, 且檔案儲存編碼為 utf-8.
不管是在IE還是Chrome,Firefox下, 點按鈕提交的漢字均為utf-8編碼.

      

2.html 文檔聲明內容編碼為 gb2312, 且檔案儲存編碼為 gb2312.
不管是在IE還是Chrome,Firefox下, 點按鈕提交的漢字均為gb2312編碼.

      

上面兩種編碼提交到 www.baidu.com 進行搜尋時, 百度均可識別出來正確的漢字.

GB2312編碼時的URL地址: http://www.baidu.com/s?wd=%E4%AF%C0%C0%C6%F7
UTF-8編碼時的URL地址: http://www.baidu.com/s?wd=%E6%B5%8F%E8%A7%88%E5%99%A8

認清楚問題之後, 就可以去找正確的答案了:
百度搜尋索引鍵PHP 漢字 編碼 識別(Google被牆,所以只能用百度代替了)
由編碼識別遇到問題,思考utf8編碼Regex(php版本)

將上面的測試代碼的action指向下面這個php檔案.
你會發現不管是 GB2312 編碼提交過來的資料, 還是 UTF-8 編碼提交過來的資料, 都可以正確顯示所提交的漢字.

這裡是以PHP為例, nodejs 與此類似.

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.