中文字符占用字节数在不同编码方式下的区别

时间:2023-01-11 17:17:14

一次脑洞大开,想写一个随机生成中文玛丽苏名字的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)个字节呢?