#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++ 的类型识别功能。
修改如下:
#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 及研究一下,字符相互转换的操作及注意事项。