char函数如何处理中文对于这个问题网上没给太好的解释,据说一个说法是中文占两个字节,char[0]和char[1]分
char函数如何处理中文
对于这个问题网上没给太好的解释,据说一个说法是中文占两个字节,char[0]和char[1]分别存储中文的一部分然后拼接而成,还是不太懂。char应该不属于unicode编码,属于ANSCI的吧
比如char *test="中国";
cout<<sizeof(test)<<endl;
输出的是4,很铭心啊占2个字节,如果
cout<<test[0]<<" "<<test[1]<<endl;
输出'?'
求各位帮我解释下,谢谢各位了。
[解决办法]
这个我也不知道。但是cout << sizeof(test)<< endl;输出4是明显的,因为test是一个指针,指针的大小是4(32位平台)
[解决办法]
char是C/C++的基础数据类型,占内存中的一个字节,很多时候就直接用它代表内存中的一个字节
ansi和unicode是“概念上的字符”和“实现上的字节”之间的两种对应关系,其中ansi使用0x00~0x7F这一个字节代表英文中常出现的字符,使用此范围之外的两个字节来代表其他语言中的字符
不同语言环境下,同样的ansi编码对应的是各自语言中的某个字符,中文版windows和韩文版windows,二进制数据相同的ansi编码文本文件,文本内容完全不同——其中至少有一个是乱码
unicode将所有字符都用两个字节表示,尽可能将所有常用语言中的字符都包含在里面,因此不同语言环境下,只要支持unicode,二进制数据相同的文本文件,文本内容也完全相同
char *test="中国";
定义一个char*指针,名为test,指向常量数据区中的"中国"字符串
这是一个指针,指向一个字符串,而不是一个字符串。你使用sizeof,得到的是这个指针的大小
初学者最常犯的错误,就是以为char*是字符串类型
cout<<test
cout对于char*类型有重载,默认它指向一个ansi编码的c风格字符串,并输出此字符串
哪怕这个char*指针其实只是指向一个字符的指针,并不指向一个字符串,它也按照字符串输出
所以我一向不建议新手使用cout,因为它很聪明,比新手要聪明得多
建议使用scanf和printf,你稍微有点理解错误的地方,它就绝对给你一个错误的结果,逼你去掌握正确的知识
[解决办法]
char 只占一个字节。
汉字通常是两个字节来表示,可以使用char数组来表示汉字。
char c[2];
c[0]=0x67; c[1]=0x28; 它储存了中文国标unicode “木”字
[解决办法]中文字符也是一个个字符构成的,只不过ASCII码占一个字节,而中文占两个字节,
而计算机在判断时,会跟据第一个字节所占范围判断出是ASCII还是中文字符。
[解决办法]首先你该清楚一件事:能不能输出中文,跟char还是double没关系,甚至跟你用的是不是C/C++都没关系。
能不能输出中文,在实现上等同于“能不能在显示器上画出一个中文文字的图形来”。能否在显示器上输出中文还是玛雅文,取决于操作系统是否有相应的字库,以及是否允许你调用相应的字库。
只有在操作系统支持的前提下,C/C++标准输入输出才能调用操作系统的相应API,来实现“向显示器上绘制某种文字的图形”的功能。你在一个没装中文字库的英文操作系统里,想拿C/C++输出中文?自己一个像素一个像素的画吧。
当printf想要输出一个字符的时候,它要经过下面几个逻辑步骤:
首先,确定当前的字符编码类型
然后,根据字符编码类型,将你输入到printf的二进制数据映射到相应的字库(各语言文字图形库),获取到对应的文字图形
最后,将该文字图形调用操作系统的API输出到屏幕上
你看,这里面哪里涉及到了“这个二进制数据在C/C++语言中是用char存放还是用double存放”?
至于cout,它只是默认“char*类型的数据代表着它指向一个C风格ANSI字符串指针”而已。
你问为什么不用wchar_t不用L?wchar_t就是typedef的unsigned short,用它来代表字符,跟double在本质上就是2字节和8字节的区别,当你要操作二字节数据(例如一个UNICODE字符)的时候,用unsigned short很方便,仅此而已。至于L,那是告诉编译器“接下来这个写在代码文件里的字符串文本,存放在常量数据区时转换为UNICODE编码”,跟中文英文日文法文火星文一丁点的关系都没有。
要确定内存中的二进制数据,是如何对应概念上的字符,需要判断编码环境,setlocale等函数就是用来干这个的。因为你是中国人,在用中文操作系统中文编程软件,所以你的程序一般默认设置文本编码环境为中文标准ANSI字符集
要把二进制数据映射到字符图形,需要操作系统提供文字图形库,按照编码环境进行一一映射
至于这个二进制数据,到底在你的编程语言里是放在char还是放在double里——除了你自己之外,无人关心
[解决办法]char *test="中国";
首先你应该知道test是一个指针 类型为char * ,用test可以任意内存区,包括字符串和其他非字符串的格式 你这里指向的是一个含有中文编码的buffer 由于test本身是一个指针 而指针在x86 32位下 就是4 所以这里明显是4 而不是其他
至于
test[0] test[1]
你可以在mfc下调试时 按住ctrl + alt+ m 调试看下test的内存布局 应该是跟你环境里使用的字符编码相关的
[解决办法]
很奇怪楼主为什么奇怪。
char数组就是字符串数组呵。里面存放的是字节数据(有符号)。
中文一个字用GB2312表示就是两个字节数据。用Unicode就是3个字节数据。
你能看到中文是因为系统把这个数据转化成汉字字型显示给你看,就如ASCII码的英文字符显示一样。
有什么可奇怪呢?在没有wchar_t之前,大家都这么干。有了wchar_t,我还是这么干!
[解决办法]
你用UltraEdit可以看到文件的二进制表示,仔细对比看看就明白了。