PHP用mb_string函數(shù)庫(kù)處理與windows相關(guān)中文字符及Win環(huán)境下開(kāi)啟PHP Mb_String方法
PHP用mb_string函數(shù)庫(kù)處理與windows相關(guān)中文字符
昨天想批處理以前下載的一堆文件,把文件里的關(guān)鍵內(nèi)容用正則匹配出來(lái),集中處理。在操作文件時(shí)遇到一個(gè)問(wèn)題,就是windows操作系統(tǒng)中的編碼問(wèn)題。
我們都知道windows中(當(dāng)然是中文版),文件名和文件內(nèi)容等編碼都是gbk,而我們?cè)陂_(kāi)發(fā)過(guò)程中,IDE里的編碼則是UTF-8,(這里不討論為什么等等問(wèn)題,
只考慮怎么把編碼轉(zhuǎn)變成一樣的)所以導(dǎo)致我寫(xiě)的UTF-8編碼的正則模式字符串中的中文在gbk編碼的文件中并不能正確匹配。
一開(kāi)始,我并沒(méi)有什么辦法,試過(guò)把PHP腳本文件的編碼也改成GBK,也可以用,但是想到這種方法太low了,所以找一找PHP中有沒(méi)有函數(shù)可以滿足我的需求。
這時(shí),我想到了以前在處理windows中的文件名時(shí)用的函數(shù)iconv(),其函數(shù)原型如下:
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');
來(lái)處理文件名,將文件名改從gbk改為UTF-8而內(nèi)容不變。
手冊(cè)翻譯附加:
如果你在輸出字符串$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)跳過(guò)這個(gè)字符。
如果你什么都沒(méi)加,就在遇到不能替換成UTF-8的字符時(shí),替換會(huì)被中斷。
但是,我在用這個(gè)函數(shù)處理時(shí),結(jié)果卻是這樣:
意思是iconv()函數(shù)能處理的最大字符數(shù)只有64,一般的文件名大小,而我的文件內(nèi)容很顯然不止64個(gè)字符。
沒(méi)有辦法,我只好再次各種翻找別的函數(shù)。
直到我發(fā)現(xiàn)了mb_string函數(shù)庫(kù),這個(gè)函數(shù)庫(kù)一般都在PHP環(huán)境里集成,我們可以在phpinfo()里找到它。
mb_string函數(shù)里有一個(gè)mb_convert_encoding()函數(shù),可以將一個(gè)字符串的編碼改變,其函數(shù)原型如下:
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()函數(shù)差不多,只是它沒(méi)有對(duì)輸出函數(shù)的后綴修飾,它也沒(méi)有對(duì)字符串長(zhǎng)度的明確限制。
而且我們看到$from_encoding是可選的,它可以自動(dòng)識(shí)別源編碼。
因?yàn)檎也坏揭粋€(gè)確切的無(wú)法轉(zhuǎn)碼的字符,也不知道它遇到無(wú)法轉(zhuǎn)碼的字符會(huì)怎么處理。
通過(guò)mb_convert_encoding()函數(shù),將整個(gè)文件處理了一下,于是,問(wèn)題順利解決。
最后介紹一下mb_string函數(shù)庫(kù),它全名叫Multibyte String,它的很多方法都擴(kuò)展自PHP自身的string函數(shù)庫(kù),函數(shù)名在原函數(shù)的前面加了"mb_",這些函數(shù)除了擁有原函數(shù)的作用外,還在可選參數(shù)的最后加入了一個(gè)$encoding的可選參數(shù),這個(gè)參數(shù)可以規(guī)定函數(shù)以什么樣的編碼方式來(lái)處理字符串。
例如strpos()函數(shù),找到一個(gè)字符串在另一個(gè)字符串中的位置。
strpos("歡迎來(lái)訪問(wèn)","問(wèn)",0)返回的結(jié)果是12,因?yàn)槟_本是UTF-8編碼,而將字符串轉(zhuǎn)為UTF-8編碼后,每個(gè)中文字符會(huì)占用3個(gè)字節(jié)。
而在mb_strpos()函數(shù)中,mb_strpos("歡迎來(lái)訪問(wèn)","問(wèn)",0,'utf-8')則會(huì)返回4,它會(huì)將字符串當(dāng)作已經(jīng)轉(zhuǎn)UTF-8的狀態(tài)執(zhí)行。
而mb_strpos("歡迎來(lái)訪問(wèn)","問(wèn)",0,'gbk')會(huì)返回6
當(dāng)然,它還有更多有特色的地方~
下面給大家介紹Windows環(huán)境下開(kāi)啟PHP Mb_String方法
前幾天跑一個(gè)Php程序,需要轉(zhuǎn)字符編碼,可是一探服務(wù)器,居然說(shuō)不支持Mb_String擴(kuò)展。我查了Php的擴(kuò)展庫(kù)里是有php_mbstring.dll這個(gè)文件的。
下面將打開(kāi)的方法告訴大家
1.確保你的Windows/system32下有php_mbstring.dll這個(gè)文件,沒(méi)有就從你Php安裝目錄extensions里拷入Windows/system32里面。
2.在windows目錄下找到php.ini打開(kāi)編輯,搜索mbstring.dll,找到
;extension=php_mbstring.dll
然后將前面的;號(hào)去掉,打開(kāi)對(duì)組件的支持
3.重啟PHP服務(wù)(如果不會(huì)你可重新啟一下計(jì)算機(jī))
4.完成
相關(guān)文章
php簡(jiǎn)單中獎(jiǎng)算法(實(shí)例)
下面小編就為大家?guī)?lái)一篇php簡(jiǎn)單中獎(jiǎng)算法(實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08PHP之認(rèn)識(shí)(二)關(guān)于Traits的用法詳解
這篇文章主要介紹了PHP Traits的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04php 文件上傳至OSS及刪除遠(yuǎn)程阿里云OSS文件
今天給大家介紹php 文件上傳至OSS及刪除遠(yuǎn)程阿里云OSS文件的方法,在刪除文件的時(shí)候大家記住千萬(wàn)不要帶域名,具體操作示例參考下本文2021-07-07Thinkphp和Bootstrap結(jié)合打造個(gè)性的分頁(yè)樣式(推薦)
這篇文章主要介紹了Thinkphp和Bootstrap結(jié)合打造個(gè)性的分頁(yè)樣式(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08PHP、Python和Javascript的裝飾器模式對(duì)比
這篇文章主要介紹了PHP、Python和Javascript的裝飾器模式對(duì)比,修飾模式(Decorator Pattern),又叫裝飾者模式,是面向?qū)ο缶幊填I(lǐng)域中,一種動(dòng)態(tài)地往一個(gè)類(lèi)中添加新的行為的設(shè)計(jì)模式,需要的朋友可以參考下2015-02-02workerman結(jié)合laravel開(kāi)發(fā)在線聊天應(yīng)用的示例代碼
聊天功能是很常見(jiàn)的一種功能,Workerman是一款開(kāi)源高性能異步PHP socket即時(shí)通訊框架。這篇文章主要介紹了workerman結(jié)合laravel開(kāi)發(fā)在線聊天應(yīng)用,感興趣的小伙伴們可以參考一下2018-10-10laravel通過(guò)a標(biāo)簽從視圖向控制器實(shí)現(xiàn)傳值
今天小編就為大家分享一篇laravel通過(guò)a標(biāo)簽從視圖向控制器實(shí)現(xiàn)傳值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10php利用array_search與array_column實(shí)現(xiàn)二維數(shù)組查找
這篇文章主要介紹了php利用array_search與array_column實(shí)現(xiàn)二維數(shù)組查找,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07