PHP中的另外一個(gè)函數(shù)iconv也是用來(lái)轉(zhuǎn)換編碼的
2021-01-31
在PHP代碼轉(zhuǎn)換中使用mb_convert_encoding和iconv的說(shuō)明
更新時(shí)間:2009年12月16日17:43:25作者:
mb_convert_encoding此函數(shù)用于轉(zhuǎn)換編碼。我從不了解程序編碼的概念,但現(xiàn)在似乎有所啟發(fā)。
但是,英語(yǔ)通常不會(huì)出現(xiàn)編碼問(wèn)題,只有中文數(shù)據(jù)會(huì)出現(xiàn)此問(wèn)題。例如,當(dāng)您使用Zend Studio或Editplus編寫(xiě)程序時(shí),將使用gbk編碼。如果需要將數(shù)據(jù)輸入數(shù)據(jù)庫(kù),并且數(shù)據(jù)庫(kù)編碼為utf8,則必須對(duì)數(shù)據(jù)進(jìn)行編碼和轉(zhuǎn)換,否則在進(jìn)入數(shù)據(jù)庫(kù)時(shí)會(huì)出現(xiàn)亂碼。
有關(guān)mb_convert_encoding的用法,請(qǐng)參見(jiàn)官方文件:
將GBK轉(zhuǎn)換為UTF-8
復(fù)制代碼,代碼如下:
又一個(gè)GB2312到Big5
復(fù)制代碼,代碼如下:
但是,要使用上述功能,需要安裝它,但需要首先啟用mbstring擴(kuò)展庫(kù)。
PHP中的另一個(gè)函數(shù)iconv也用于轉(zhuǎn)換字符串編碼,類似于上面的函數(shù)。
下面有一些詳細(xì)的示例:
iconv —將字符串轉(zhuǎn)換為請(qǐng)求的字符編碼
(PHP 4> =4.0.5,PHP5)
mb_convert_encoding —轉(zhuǎn)換字符編碼
(PHP 4> =4.0.6,PHP5)
用法:
字符串mb_convert_encoding(字符串str,字符串to_encoding [,混合from_encoding])
您需要先啟用mbstring擴(kuò)展庫(kù),然后刪除; extension = php_mbstring.dll在前面;在php.ini中
mb_convert_encoding可以指定多種輸入編碼,它將根據(jù)內(nèi)容自動(dòng)識(shí)別,但是執(zhí)行效率比iconv差很多;
字符串iconv(字符串in_charset,字符串out_charset,字符串str)
注意:第二個(gè)參數(shù)除了指定要轉(zhuǎn)換的編碼之外,還可以添加兩個(gè)后綴:// TRANSLIT和// IGNORE,其中// TRANSLIT將自動(dòng)更改無(wú)法直接轉(zhuǎn)換為一個(gè)的字符更多類似的字符,// IGNORE將忽略無(wú)法轉(zhuǎn)換的字符,默認(rèn)效果是從第一個(gè)非法字符開(kāi)始切斷。
失敗時(shí)返回轉(zhuǎn)換后的字符串或FALSE。
使用:
發(fā)現(xiàn)iconv將字符“ —”轉(zhuǎn)換為gb2312時(shí)會(huì)出錯(cuò)。如果沒(méi)有ignore參數(shù),則無(wú)法保存字符后的所有字符串。在任何情況下,該“ —”都無(wú)法成功轉(zhuǎn)換,也無(wú)法輸出。此外,mb_convert_encoding沒(méi)有此錯(cuò)誤。
通常,使用iconv,并且僅在無(wú)法確定原始編碼或轉(zhuǎn)換后無(wú)法正常顯示iconv時(shí),才使用mb_convert_encoding函數(shù)。
from_encoding由轉(zhuǎn)換前的字符代碼名稱指定。它可以是數(shù)組或字符串逗號(hào)分隔的枚舉列表。如果未指定,則將使用內(nèi)部編碼。
/ *自動(dòng)檢測(cè)JIS,eucjp-win,sjis-win的編碼,然后將str轉(zhuǎn)換為UCS-2LE * /
$ str = mb_convert_encoding($ str,“ UCS-2LE”,“ JIS,eucjp-win,sjis-win”);
/ *“自動(dòng)”擴(kuò)展為“ ASCII,JIS,UTF-8,EUC-JP,SJIS” * /
$ str = mb_convert_encoding($ str,“ EUC-JP”,“ auto”);
示例:
復(fù)制代碼,代碼如下:
$ content = iconv(“ GBK”,“ UTF-8”,$ content);
$ content = mb_convert_encoding($ content,“ UTF-8”,“ GBK”);
在PHP中使用mb_convert_encoding轉(zhuǎn)碼的小陷阱
每個(gè)人都熟悉使用mb_convert_encoding()方法進(jìn)行php程序中的字符編碼轉(zhuǎn)換,并且在平時(shí)也大量使用它。總的來(lái)說(shuō),這種方法也表現(xiàn)出色,值得稱贊。但是在一個(gè)項(xiàng)目中,我們需要使用它將UTF8轉(zhuǎn)換為GBK,并且在轉(zhuǎn)換某些特殊字符時(shí)發(fā)現(xiàn)了一個(gè)小問(wèn)題。特定的性能是mb將可以在utf8中編碼但不能在gbk中編碼的字符轉(zhuǎn)換為\ 0x00 \ 0x80,這導(dǎo)致轉(zhuǎn)換后的gbk字符有問(wèn)題。
在我們的思想中,在字符編碼轉(zhuǎn)換過(guò)程中,如果遇到目標(biāo)編碼無(wú)法表達(dá)的字符,那么代碼轉(zhuǎn)換程序應(yīng)該做的就是丟棄該字符,以便盡管丟失了一些數(shù)據(jù),但是不會(huì)導(dǎo)致轉(zhuǎn)碼的字符序列不可用。尚不清楚mb為什么使用上述方法而不是放棄它。
臨時(shí)解決方案是過(guò)濾轉(zhuǎn)碼后的字符串序列php url編碼轉(zhuǎn)換,以過(guò)濾掉\ x00 \ 80的所有字符;或在轉(zhuǎn)義之前過(guò)濾utf8字符串以過(guò)濾出可以表示的ut8和gbk對(duì)于所有無(wú)法表示的字符,從實(shí)現(xiàn)難度上來(lái)說(shuō)php url編碼轉(zhuǎn)換,第一種過(guò)濾方法相對(duì)容易實(shí)現(xiàn)。