UTF-8編碼檢測失敗特例

來源:互聯網
上載者:User
    Ruby中進行UTF-8編碼檢測的方法是String#unpack方法,傳入 "U*" 模板。這個模板的意思是把字串當成一個UTF-8串,分別把每一個Unicode字元轉換成對應的代碼點並組合為數組。字串本身確實是UTF-8,則能夠轉換成功,否則將拋出異常。根據這種行為,給String添加如下執行個體方法:

  class String
    def utf8?
      unpack('U*') rescue return false
      true
    end
  end

    以上程式在大部分情況下確實正確。但是我發現GB2312編碼中,下列漢字的GB2312編碼能夠通過上面方法的檢測,而被誤認為是UTF-8串:
 
    位、前、支、校、寫、元

    可能還有一些。因此,上述方法不適宜用來對可能包含GB2312編碼的中文字串進行UTF-8編碼檢測。

    注意這不是Ruby的問題,而是不同編碼模式導致的本質難題。

    可以做以下實驗:
 
    1. 開啟notepad,寫入一個‘位’字,不斷行符號,直接以ANSI編碼儲存(注意必須用ANSI編碼儲存)。

    2. 再次開啟這個檔案,你會看到顯示出來的不是“位”字,而是λ。

    同樣,“前、支、校、寫、元” 等單字也存在類似現象。

    可見字串編碼檢測並不容易。不知有沒有什麼可靠的方法(除了用Iconv庫直試轉以外),望知者不吝賜教。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.