1. 程式人生 > >中文字元佔用位元組數在不同編碼方式下的區別

中文字元佔用位元組數在不同編碼方式下的區別

一次腦洞大開,想寫一個隨機生成中文瑪麗蘇名字的php小指令碼,需要從檔案中逐一讀取中文字元。

本來想說用fgetc()一個一個讀取字元,後來突然發現fgetc()是一次讀取一個位元組,對於英文字元來說沒有問題,但是對於中文字元,每個字元佔用兩個位元組,這樣就行不通了,顯示了就會亂碼,後來想到當年做C語言課程設計的時候讀取中文檔案都是用的fread(),就拿fread一試,fread($handle,”2”),本以為這樣就可以了,卻驚訝地發現這樣依然是亂碼,百思不得其解,這麼多年,C語言教程上,老師說,學長說的都是一箇中文字元是兩個位元組,為啥一次讀取兩個位元組仍然是亂碼呢。。。

後來,不經意間把2改成了3,本來抱著試一試的心態,卻驚喜地發現不再亂碼了。我突然意識到,編碼!以前的教程,和windows下,編碼都用的GB2312或者是GBK,這裡面中文字元都是佔用兩個位元組的,但是從來沒有注意過utf-8裡的中文佔用幾個位元組,這一百度,才恍然大悟,utf-8編碼中文一般都是三個位元組,終於,一切都清楚了。。。

後來又進一步百度了一下,utf-8編碼字元所佔位元組數是不固定的,一箇中文字元,2-4個位元組都有可能,這就讓從檔案中逐位元組讀取很難受了,所以我感覺以後涉及到中文的逐位元組讀取還是使用GBK或者GB2312比較好。

看來,還是小平同志說的好啊,實踐是檢驗真理的唯一標準,光聽人說,光看書是不夠的,還是要去動手實踐啊

PS:還有一個問題,就是如果中文和英文混雜在一起,想從一大段字元中(有中文也有英文)隨機讀取一個字元,迴圈到要隨機讀取的位置,怎樣判斷要讀的是英文字元(一個位元組)還是中文字元(2-4)個位元組呢?