字符编码-教程(8)-字符串长度与字符编码

字符串长度与字符编码


在双字节中文编码(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不是两个字节,具体要看编码方式,测试字符串长度函数:判断长度依据是计算字符数 还是计算字节数】

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments