windows 上c\c++ 字符处理,wchar,char 那些事

#include<stdio.h>
#include<tchar.h>
#include<windows.h>
#include<locale.h>
int main()
{
    _tsetlocale(LC_CTYPE, TEXT(""));
    char szBuffer[] = "你好";
    wchar_t wzBuffer[] = L"你好";
    TCHAR tzBuffer[] = TEXT("你好");
    printf("char: %s\r\n", szBuffer);
    printf("wchar: %S\r\n", wzBuffer);
    printf("char: %S\r\n", szBuffer);
    printf("wchar: %s\r\n", wzBuffer);
    printf("\r\n");
    _tprintf(TEXT("tchar: %s\r\n"), tzBuffer);
    _tprintf(TEXT("tchar: %S\r\n"), tzBuffer);
    printf("\r\n");
    wprintf(L"char: %S\r\n", szBuffer);
    wprintf(L"wchar: %s\r\n", wzBuffer);
    wprintf(L"char: %s\r\n", szBuffer);
    wprintf(L"wchar: %S\r\n", wzBuffer);
    
    getchar();
    getchar();
    return 0;
}

在这里插入图片描述

当我们去掉

_tsetlocale(LC_CTYPE, TEXT(""));

在这里插入图片描述

此时,wchar 无法正常显示,vs 项目设置为unicode,因此,tchar 对应的也是,wchar,无法显示。

规律比较明显了, 当使用_tprintf 就使用 %s 就可正常显示。

方法%s%S
printfcharwchar
wprinfwcharchar

C 中的,char,wchar 输出就是这样。
下面,来看c++ 中。项目设置为多字节

#include<iostream>
using namespace std;
int main()
{
    //_tsetlocale(LC_CTYPE, TEXT(""));
    char szBuffer[] = "你好";
    wchar_t wzBuffer[] = L"你好";
    TCHAR tzBuffer[] = TEXT("你好");
    cout << "char " << szBuffer << endl;
    cout << "wchar " << wzBuffer << endl;
    cout << "tzBuffer " << tzBuffer << endl;

    cout << endl;

    wcout << L"char " << szBuffer << endl;
    wcout << L"wchar " << wzBuffer << endl;
    wcout << L"tzBuffer " << tzBuffer << endl;
    getchar();
    getchar();
    return 0;
}

在这里插入图片描述

刚开始我们没有_tsetlocale。
上面的,cout 中,自动识别了类型,当参数不是char* ,而是wchar*,cout 直接只输出了wchar* 的参数的地址,这也是,c++强大的一个地方,类型识别。
后面,发现,wchar 也是,成功输出了,char,但,wchar 输出了一般就停在那里等待输入,不知道出了什么问题。现在开启_tsetlocale:
在这里插入图片描述
卡在了,char,没关系,我们暂时,注释掉它。
在这里插入图片描述

之后发现,可以正常显示wchar 了。
当然,我们使用c++ 的使用,字符处理,绝大多数情况下,都使用的string 而不会自己手动char* 或者,字符数组,下面测试,string。

#include<stdio.h>
#include<tchar.h>
#include<windows.h>
#include<locale.h>
#include<iostream>
#include<string>
using namespace std;
int main()
{
    _tsetlocale(LC_CTYPE, TEXT(""));
    string strA("你好");
    wstring strW(L"你好");
   
    cout << "string " << strA << endl;
    cout << "wstring " << strW << endl;
    
    cout << endl;

    wcout << L"string " << strA << endl;
    wcout << L"wstring " << strW << endl;
    getchar();
    getchar();
    return 0;
}

在这里插入图片描述

直接,无法操作,c++ 的类型识别功能。
修改如下:

#include<stdio.h>
#include<tchar.h>
#include<windows.h>
#include<locale.h>
#include<iostream>
#include<string>
using namespace std;
int main()
{
    _tsetlocale(LC_CTYPE, TEXT(""));
    string strA("你好");
    wstring strW(L"你好");
   
    cout << "string " << strA << endl;
    //cout << "wstring " << strW << endl;
    
    cout << endl;

    //wcout << L"string " << strA << endl;
    wcout << L"wstring " << strW << endl;
    getchar();
    getchar();
    return 0;
}

可正常输出
在这里插入图片描述
我们尝试一下,去掉,_tsetlocale ,看,string 是否可以正常识别中文字符。
在这里插入图片描述
发现不可以。

之后研究一下_tsetlocale 及研究一下,字符相互转换的操作及注意事项。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值