中文字元擷取是乙個十分有用的功能,在很多地方都會用到,比如提取定長標題,抽取標籤等
由於各種字符集的儲存方式的不一樣,存在雙位元組(gbk)多位元組(unicode)的儲存方式,這就導致了統一處理的困難。
國際標準utf8字元編碼中,儲存中文字元要3個位元組,即把php檔案儲存為utf8編碼格式可以得到
strlen("中")=3
假如直接用php的字串函式去處理類似這個字元將可能產生亂友的情況,主要是由於在乙個完整字元中間強制截斷產生半字元的情況。要避免這種情況的唯一辦法就是把截斷位置延長到這個字元結束的位置進行截斷
在php中,提供了mbstring模組功能,mbstring以字元作為操作的基本單元,如mb_strlen("中","utf-8")=1 。 大部分的mbstring都要求輸入編碼,當然可以在php環境中設定預設的編碼。引數設定為mbstring.internal_encoding = utf-8, mbstring.http_input = utf-8, mbstring.http_output = utf-8, mbstring.substitute_character = utf-8。由於php系統一般是儲存位元組來計算長度的,為了消除mbstring和string之間的差異,使用mbstring的時候就要格外小心 了。
假如不使用mbstring的功能 的話,可以自行編寫中文字元處理的函式。
php中文擷取函式,經網上搜尋學習發現,大部分網路中都是以從開始位置乙個乙個完整字元來實現的。這有可能導致效率十分底。下面我寫了個擷取函式,是針對utf8的
224-239是utf8中文字元高位(第一位,共三位)ascii區間,換算成十六進製制為0xe0 - 0xef 二進位制為1100 0000 - 1100 ffff。通過適當偏移擷取位置來避免在乙個字元的中間截斷的現象。
附utf8字元編碼規則:區間無重複。
儲存位元組數
位元組流( 二進位制)(x為可變位)
最高位區間(10進製)
低位區間
一位元組0******x
00 - 7f
無二位元組
110***xx 10******
c0 - df
80 - bf
三位元組1110***x 10****** 10******
e0 - ef
80 - bf
四位元組11110*** 10****** 10****** 10******
f0 - ff
80 - bf
在gbk字元編碼中,儲存中文字元要2個位元組,即
把php檔案儲存為ansi(gbk)編碼格式
可以得到
strlen("中")=2
在gbk字元編碼中,中文字元最高位指定是1。
gbk 亦採用雙位元組表示,總體編碼範圍為 8140-fefe,首位元組在 81-fe 之間,尾位元組在 40-fe之間,剔除 xx7f一條線。總計 23940個碼位,共收入 21886個漢字和圖形符號,其中漢字(包括部首和構件) 21003個,圖形符號 883個。高位和低位有可能相同所以無法判斷高低位了。
但我們知道,gbk2312編碼是 在區位碼的區號和位號上分別加上0xa0就得到的,區位碼中01-09區是符號、數字區,16-87區是漢字區,10-15和88-94是未定義的空白區。所有漢字的編碼為16-87加上0xa0,那麼我們可以通過判斷大於oxa1來判定是否是乙個漢字字元。
php實現如下
PHP中文GBK編碼轉UTF 8
iconv 和 mb convert encoding的區別 string mb convert encoding string str,string to encoding mixed from encoding 需要先enable mbstring 擴充套件庫,在 php.ini裡將 exten...
關於qt中文utf 8轉gbk
筆者經歷了糟心的兩天時間,說多了都是淚,希大家有所幫助,不再同乙個地方浪費時間。筆者的任務 從資料庫獲取utf 8編碼的含中文的字串,並在linux平台使用qt顯示在 中。筆者所遇問題 中文始終為亂碼,度娘上mian函式加類似下面的函式也並沒用 qtextcodec codec qtextcodec...
UTF 8和GBK的區別
utf 8和gbk的區別 2009年06月09日 星期二 下午 02 00 gbk是國家標準gb2312基礎上擴容後相容gb2312的標準。gbk的文字編碼是用雙位元組來表示的,即不論中 英文本元均使用雙位元組來表示,為了區分中文,將其最高位都設定成1。gbk包含全部中文字元,是國家編碼,通用性比u...