天天看點

中文字元轉碼

php 提供了兩個常用的轉碼函數

<b>iconv</b> ( string $in_charset , string $out_charset , string $str ) 和

<b>mb_convert_encoding</b> ( string $str , string $to_encoding [, $from_encoding ] )(需要enable mbstring 擴充)

具體使用可以參考手冊,我這裡要說的是在使用mb_convert_encoding時可以配合mb_detect_encoding函數“探測”輸入字元編碼,代碼如下

同時在使用mb_conver_encoding應注意一下情況:

PHP中使用mb_convert_encoding轉碼的小陷阱

在php程式中使用mb_convert_encoding()方法進行字元編碼轉換大家都很熟悉了,平時也在大量的使用。而且在一般情況下該方法也表現 的足夠好,值得表揚。但在一個項目中我們需要使用它進行UTF8到GBK的轉換,在轉換一些特殊字元時發現了一個不大不小的問題。具體表現為mb把在 utf8可編碼的字元而在gbk中不可編碼的字元都轉成了\0x00\0x80,這樣就導緻轉換後的gbk字元是有問題的。

在我們的意識中,在進行字元編碼轉換的過程中,如果遇到目标編碼不可表現的字元,轉碼程式應該做的是舍棄這種字元,這樣雖然丢失了部分資料,但不會導緻轉碼的字元序列不可用。不清楚mb為什麼要使用上述方式而不是舍棄方式。

臨時的解決方式是對轉碼後的字元串序列進行過濾,過濾掉所有\x00\80的字元;又或者在轉義之前對utf8的字元串進行過濾,過濾掉ut8可表示而gbk不可表示的所有字元,從實作難度上來講,第一種過濾方式比較容易做到。