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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18218335/article/details/85048242
#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
printf char wchar
wprinf wchar char

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++ 的类型识别功能。
修改如下:

扫描二维码关注公众号,回复: 5001619 查看本文章
#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 及研究一下,字符相互转换的操作及注意事项。

猜你喜欢

转载自blog.csdn.net/qq_18218335/article/details/85048242