中文字符占用字节数在不同编码方式下的区别
2016-09-17 11:34
543 查看
一次脑洞大开,想写一个随机生成中文玛丽苏名字的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)个字节呢?
本来想说用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)个字节呢?
相关文章推荐
- Java不同编码方式,中英文字符所占字节数
- c#中Encoding的不同编码方式的区别
- 设置默认编码方式 &不同编码方式的区别
- java不同的编码格式下字符串所占用的字节数
- IO流:编码方式,字节字符区别以及一些流的父类的区别以及使用情况。
- 英文字母和中文汉字在不同字符集编码下的字节数
- 英文字母和中文汉字在不同字符集编码下的字节数
- 字符串-不同的编码格式下所占用的字节数【转】
- 为什么ASCII是7位(导致各家编码的128~256字符都不同,给我带来很多困惑)——在标准ASCII中,其最高位(b7)用作奇偶校验位,附ASCII每个控制符的中文解释
- Python2.7 中文字符编码 & Pycharm utf-8设置、Unicode与utf-8的区别
- 英文字母和中文汉字在不同字符集编码下的字节数
- 通过“中文”两个字来深度剖析各种不同的编码方式,彻底理解乱码是如何产生的?
- JDBC读取Oracle的US7ASCII编码中文乱码及不同编码下汉字占用字节的问题
- json_encode不编码中文字符的方式
- 英文字母和中文汉字在不同字符集编码下的字节数
- Java中字符串在不同字符编码中所占字节数
- 英文字母和中文汉字在不同字符集编码下的字节数
- 非接触IC卡中typeA卡和typeB卡的区别--总结,二者的调制方式和编码方式不同
- 不同字符集编码的英文字母和中文汉字的字节数
- MySQL查询中使用Concat关键字来拼接中文字符乱码(不同的数据类型拼接)解决方式