字符串长度与字符编码
在双字节中文编码(DBCS)中,“一个汉字算两个英文字符!一个汉字算两个英文字符……”【其实这句话的本意是:在双字节中文编码中,兼容了ASCII,导致英文编码只占一个字节,中文编码占二个字节,所以一个汉字算两个英文】
比如下面的C代码:
如果用gbk编码保存文件,”我爱你祖国”编码的二进制流占10个字节。程序输出字符串长度为10
如果用utf-8编码保存文件,”我爱你祖国”编码的二进制流占15个字节。程序输出字符串长度为15
#include <stdio.h> #include <string.h> int main(){ char str[20]="我爱你祖国"; printf("%d\n",strlen(str)); getchar(); } /************ 在C语言中:strlen 在处理汉字串时,与处理一般的英文串是一样的, 就是计算从串首地址开始检查到'\0'字符的位置,然后计算两个地址的差,返回差值, 也就是字符串中有多个字符(字节)'\0'字符不是汉字的组成部分! 对于一个汉字占几个字节,不同的字符集是不同的, 如果环境变量设置为utf8,则一个汉字占三个字节 如果设置成gbk类,则一个汉字占两个字节 ************/
一个字符和两个字节的故事: 这时候,从旧社会里走过来的程序员开始发现一个奇怪的现象:他们的strlen函数靠不住了,一个汉字不再是相当于两个字符了,而是一个!是的,从 UNICODE 开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的“一个字符”!同时,也都是统一的“两个字节”,请注意“字符”和”字节”两个术语的不同,“字节”是一个8位的物理存贮单元,而“字符”则是一个文化相关的符号。在UNICODE 中,一个字符就是两个字节。一个汉字算两个英文字符的时代已经快过去了。【备注:前面这段话不靠谱,Unicode是字符集,Unicode不是两个字节,具体要看编码方式,测试字符串长度函数:判断长度依据是计算字符数 还是计算字节数】