1. 程式人生 > >PHP用mb_string函式庫處理與windows相關中文字元

PHP用mb_string函式庫處理與windows相關中文字元

昨天想批處理以前下載的一堆檔案,把檔案裡的關鍵內容用正則匹配出來,集中處理。在操作檔案時遇到一個問題,就是windows作業系統中的編碼問題。

我們都知道windows中(當然是中文版),檔名和檔案內容等編碼都是gbk,而我們在開發過程中,IDE裡的編碼則是UTF-8,(這裡不討論為什麼等等問題,

只考慮怎麼把編碼轉變成一樣的)所以導致我寫的UTF-8編碼的正則模式字串中的中文在gbk編碼的檔案中並不能正確匹配。

一開始,我並沒有什麼辦法,試過把PHP指令碼檔案的編碼也改成GBK,也可以用,但是想到這種方法太low了,所以找一找PHP中有沒有函式可以滿足我的需求。

這時,我想到了以前在處理windows中的檔名時用的函式iconv()

,其函式原型如下:

string iconv ( string $in_charset , string $out_charset , string $str )

Performs a character set conversion on the string str from in_charset to out_charset. 

我們常使用:

$out_charset='utf-8';

$fileName=iconv($fileName,$out_charset,'gbk');

來處理檔名,將檔名改從gbk改為UTF-8而內容不變。

手冊翻譯附加:

  • 如果你在輸出字串$out_charset後面新增//TRANSLIT即$out_charset='utf-8//TRANSLIT',在遇到不能轉換為UTF-8的字元時,程式會自動替換為一個相似字元的UTF-8字元;
  • 如果你在輸出字串$out_charset後面新增//IGNORE即$out_charset='utf-8//IGNORE',在遇到不能轉換為UTF-8的字元時,程式會自動跳過這個字元。
  • 如果你什麼都沒加,就在遇到不能替換成UTF-8的字元時,替換會被中斷。

但是,我在用這個函式處理時,結果卻是這樣:

意思是iconv()函式能處理的最大字元數只有64,一般的檔名大小,而我的檔案內容很顯然不止64個字元。

沒有辦法,我只好再次各種翻找別的函式。

直到我發現了mb_string函式庫,這個函式庫一般都在PHP環境裡整合,我們可以在phpinfo()裡找到它。

mb_string函式裡有一個mb_convert_encoding()

函式,可以將一個字串的編碼改變,其函式原型如下:

string mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding ] )

Converts the character encoding of string str to to_encoding from optionally from_encoding. 

基原型跟iconv()函式差不多,只是它沒有對輸出函式的字尾修飾,它也沒有對字串長度的明確限制。

而且我們看到$from_encoding是可選的,它可以自動識別源編碼。

因為找不到一個確切的無法轉碼的字元,也不知道它遇到無法轉碼的字元會怎麼處理。

通過mb_convert_encoding()函式,將整個檔案處理了一下,於是,問題順利解決。

最後介紹一下mb_string函式庫,它全名叫Multibyte String,它的很多方法都擴充套件自PHP自身的string函式庫,函式名在原函式的前面加了"mb_",這些函式除了擁有原函式的作用外,還在可選引數的最後加入了一個$encoding的可選引數,這個引數可以規定函式以什麼樣的編碼方式來處理字串。

例如strpos()函式,找到一個字串在另一個字串中的位置。

strpos("歡迎來訪問","問",0)返回的結果是12,因為指令碼是UTF-8編碼,而將字串轉為UTF-8編碼後,每個中文字元會佔用3個位元組。

而在mb_strpos()函式中,mb_strpos("歡迎來訪問","問",0,'utf-8')則會返回4,它會將字串當作已經轉UTF-8的狀態執行。

而mb_strpos("歡迎來訪問","問",0,'gbk')會返回6

當然,它還有更多有特色的地方~

如果您覺得本博文對您有幫助,您可以推薦或關注我,如果您有什麼問題,可以在下方留言討論,謝謝。