溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP如何使用mb_string處理windows中文字符

發(fā)布時(shí)間:2021-05-27 11:16:11 來源:億速云 閱讀:115 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)PHP如何使用mb_string處理windows中文字符的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

我們都知道windows中(當(dāng)然是中文版),文件名和文件內(nèi)容等編碼都是gbk,而我們在開發(fā)過程中,IDE里的編碼則是UTF-8,(這里不討論為什么等等問題,只考慮怎么把編碼轉(zhuǎn)變成一樣的)所以導(dǎo)致我寫的UTF-8編碼的正則模式字符串中的中文在gbk編碼的文件中并不能正確匹配。

一開始,我并沒有什么辦法,試過把PHP腳本文件的編碼也改成GBK,也可以用,但是想到這種方法太low了,所以找一找PHP中有沒有函數(shù)可以滿足我的需求。

這時(shí),我想到了以前在處理windows中的文件名時(shí)用的函數(shù)iconv(),其函數(shù)原型如下:

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

Performsacharactersetconversiononthestringstrfromin_charsettoout_charset.

我們常使用:

$out_charset='utf-8';

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

來處理文件名,將文件名改從gbk改為UTF-8而內(nèi)容不變。

手冊翻譯附加:

  • 如果你在輸出字符串$out_charset后面添加//TRANSLIT即$out_charset='utf-8//TRANSLIT',在遇到不能轉(zhuǎn)換為UTF-8的字符時(shí),程序會(huì)自動(dòng)替換為一個(gè)相似字符的UTF-8字符;

  • 如果你在輸出字符串$out_charset后面添加//IGNORE即$out_charset='utf-8//IGNORE',在遇到不能轉(zhuǎn)換為UTF-8的字符時(shí),程序會(huì)自動(dòng)跳過這個(gè)字符。

  • 如果你什么都沒加,就在遇到不能替換成UTF-8的字符時(shí),替換會(huì)被中斷。

但是,我在用這個(gè)函數(shù)處理時(shí),結(jié)果卻是這樣:

PHP如何使用mb_string處理windows中文字符

意思是iconv()函數(shù)能處理的最大字符數(shù)只有64,一般的文件名大小,而我的文件內(nèi)容很顯然不止64個(gè)字符。

沒有辦法,我只好再次各種翻找別的函數(shù)。

直到我發(fā)現(xiàn)了mb_string函數(shù)庫,這個(gè)函數(shù)庫一般都在PHP環(huán)境里集成,我們可以在phpinfo()里找到它。

PHP如何使用mb_string處理windows中文字符

mb_string函數(shù)里有一個(gè)mb_convert_encoding()函數(shù),可以將一個(gè)字符串的編碼改變,其函數(shù)原型如下:

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

Convertsthecharacterencodingofstringstrtoto_encodingfromoptionallyfrom_encoding.

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

而且我們看到$from_encoding是可選的,它可以自動(dòng)識(shí)別源編碼。

因?yàn)檎也坏揭粋€(gè)確切的無法轉(zhuǎn)碼的字符,也不知道它遇到無法轉(zhuǎn)碼的字符會(huì)怎么處理。

通過mb_convert_encoding()函數(shù),將整個(gè)文件處理了一下,于是,問題順利解決。

最后介紹一下mb_string函數(shù)庫,它全名叫MultibyteString,它的很多方法都擴(kuò)展自PHP自身的string函數(shù)庫,函數(shù)名在原函數(shù)的前面加了"mb_",這些函數(shù)除了擁有原函數(shù)的作用外,還在可選參數(shù)的最后加入了一個(gè)$encoding的可選參數(shù),這個(gè)參數(shù)可以規(guī)定函數(shù)以什么樣的編碼方式來處理字符串。

例如strpos()函數(shù),找到一個(gè)字符串在另一個(gè)字符串中的位置。

strpos("歡迎來訪問","問",0)返回的結(jié)果是12,因?yàn)槟_本是UTF-8編碼,而將字符串轉(zhuǎn)為UTF-8編碼后,每個(gè)中文字符會(huì)占用3個(gè)字節(jié)。

而在mb_strpos()函數(shù)中,mb_strpos("歡迎來訪問","問",0,'utf-8')則會(huì)返回4,它會(huì)將字符串當(dāng)作已經(jīng)轉(zhuǎn)UTF-8的狀態(tài)執(zhí)行。

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

感謝各位的閱讀!關(guān)于“PHP如何使用mb_string處理windows中文字符”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI