主题:[讨论]关于C++中的中文字符
hrhktkbzyy
[专家分:10] 发布于 2010-12-13 14:29:00
近日写程序需要处理中文字符串,遇到一些困惑,写了一段测试代码:
[code=c]
#include<iostream>
using namespace std;
int main()
{
char str2[] = "我爱祖国";
cout << "------ 测试cout输出中文 ------" << endl;
cout << str2[0] << endl;
cout << str2[0] << str2[1] << endl;
//上面两句测试了cout两次输出一个中文字符
str2[0] = '你';
cout << str2[0] << endl;
cout << str2[0] << str2[1] << endl;
//不能够将字符串第一个字符变为你
str2[0] = 0x10;
str2[1] = 0x41;
cout << str2[0] << str2[1] << endl;
//上面两句测试了更改内容后按照ASCII编码输出
return 0;
}
[/code]
请问是否有办法采用char类型字符串来保存中文字符,同时可以做到修改每一个两字节的中文字符?
回复列表 (共5个回复)
沙发
hrhktkbzyy [专家分:10] 发布于 2010-12-13 14:54:00
另外关于wchar_t类型,同样研究了一下,发现了一些问题,测试代码如下:
[code=c]
#include<iostream>
//#include <locale>
using namespace std;
int main()
{
locale loc( "chs" ); //定义“区域设置”为中文方式
wcout.imbue( loc );//载入中文字符输入方式
wchar_t str[] = L"我是中国人";
/* 测试 */
cout << "-------- 测试wcout ----------" << endl;
wcout << &str[0] << endl;
wcout << &str[1] << endl;
wcout << &str[2] << endl;
wcout << str << endl;
wcout << L"我是" << endl;
//上面两句测试了wcout输出的参数是从给定的字符串地址到字符串结束标号L'\0'为止,这样就给输出字符带来了麻烦
cout << "----- 测试wcout输出单个双字节字符 -----" << endl;
wcout << str[0] << endl <<endl;
//输出出现问题
return 0;
}
[/code]
经测试发现wcout输出字符串没有问题,输出规则为从给定的字符串首地址到字符串结束。但是不知是否有方法单个输出想要的那个字符,比如str[0]存放的字符。
我是新手,两个问题,希望得到大家指点。
板凳
bruceteen [专家分:42660] 发布于 2010-12-13 16:22:00
#include<iostream>
using namespace std;
int main()
{
str2[0] = 0xC4;
str2[1] = 0xE3;
cout << str2[0] << str2[1] << endl; // 输出"你"
return 0;
}
str2[0] = '你'; ------ 我想骂人,但忍住了,你把int赋值给char,……算了
3 楼
bruceteen [专家分:42660] 发布于 2010-12-13 16:24:00
#include<iostream>
using namespace std;
int main()
{
locale loc( "chs" );
wcout.imbue( loc );
wchar_t str[] = L"我是中国人";
wcout << str[0] << endl;
//输出出现问题 --------------------- 那你也说说出现了什么问题,真不知道你是怎么想的
return 0;
}
还有“输出规则为从给定的字符串首地址到字符串结束”,你这不是废话嘛,字符串就是以零为结尾标识
4 楼
hrhktkbzyy [专家分:10] 发布于 2010-12-14 00:19:00
[quote]#include<iostream>
using namespace std;
int main()
{
str2[0] = 0xC4;
str2[1] = 0xE3;
cout << str2[0] << str2[1] << endl; // 输出"你"
return 0;
}
str2[0] = '你'; ------ 我想骂人,但忍住了,你把int赋值给char,……算了[/quote]
首先,您可能是高手,请教你是怎么查出一个汉字的编码的,‘你’字的Unicode编码不是0x4F60吗?
其次,cout是如何判断输出内容应该按照哪一个字符系统的。难道Unicode编码的第一个字符的值都大于0x7F?如果第一字节有落在0x7F以内的,那么cout怎么知道是输出ASCII字符还是宽字符?
最后,为什么不能将int赋值给char??任何编码在计算机中的本质不都是0、1吗,在ASCII编码系统下,int和char没有本质区别。否则怎么能对char型做算数运算?!!
5 楼
hrhktkbzyy [专家分:10] 发布于 2010-12-14 00:29:00
请您看好我说的是什么:输出规则为从给定的字符串首地址到字符串结束。[color=FF0000]但是不知是否有方法单个输出想要的那个字符[/color]
既然输出规则是这样的,那么怎么用wcout输出str[0]、str[1]里面存放的字,str[0]里面有‘\0’吗!!!!!!!
有问题是因为输出的是数字而非期望的字符
我来回复