回 帖 发 新 帖 刷新版面

主题:[讨论]关于C++中的中文字符

近日写程序需要处理中文字符串,遇到一些困惑,写了一段测试代码:
[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个回复)

沙发

另外关于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]存放的字符。
我是新手,两个问题,希望得到大家指点。

板凳

#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 楼

#include<iostream>
using namespace std;
int main()
{
    locale loc( "chs" );
    wcout.imbue( loc );
    wchar_t str[] = L"我是中国人";

    wcout << str[0] << endl;
    //输出出现问题 --------------------- 那你也说说出现了什么问题,真不知道你是怎么想的

    return 0;
}

还有“输出规则为从给定的字符串首地址到字符串结束”,你这不是废话嘛,字符串就是以零为结尾标识

4 楼

[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 楼

请您看好我说的是什么:输出规则为从给定的字符串首地址到字符串结束。[color=FF0000]但是不知是否有方法单个输出想要的那个字符[/color]

既然输出规则是这样的,那么怎么用wcout输出str[0]、str[1]里面存放的字,str[0]里面有‘\0’吗!!!!!!!

有问题是因为输出的是数字而非期望的字符

我来回复

您尚未登录,请登录后再回复。点此登录或注册