一、创建一个控制台项目并设置为启动项目和更改字符集为使用多字节字符集
如果不更改默认为 使用Unicode字符集 这种设置会自动添加unicode的宏定义
(理由是系统调用函数的参数类型是 LPTSTR === TCHAR* LPCTSTR === const TCHAR* 所以在编写字符串时加L,如果更改可以省去加L)
UNICODE编码不存在解析问题 统一是两个字节 不够补零。
Windows统一使用的是UTF-16编码 Linux 是UTF-8.
二、宽字节字符
wchar_t 每个字符占2个字节 char是1个字节
wchar_t实际是unsigned short类型,定义时,需要加"L",通知编译器按照双字节编译字符串,采用UNIODE编码
三、TCHAR
可以解决分不清char类型和wchar_t类型
四、打印UNICODE字符
wprintf对UNICODE字符打印支持不完善
在Windows下使用WriteConsole API 打印UNICODE字符 GetStdHandle。
WriteConsole功能强大后续使用这个
#define UNICODE //定义unicode的宏
#include <Windows.h>
#include <stdio.h>
void C_char() {
const char* pszText = "hello char";//普通
printf("%s\n", pszText);
}
void W_char() {
const wchar_t* pszText = L"hello wchar"; //宽字节字符
int len = wcslen(pszText);
wprintf(L"%s %d\n", pszText, len);
}
void T_char() {
const TCHAR* pszText = __TEXT("hello txt");//如果是宽字节会拼装 L##字符
#ifdef UNICODE
wprintf(L"%s\n", pszText); //宽字符
#else
printf("单%s\n", pszText); //普通字符
#endif
}
void PrintUnicode() {
const wchar_t* pszText = L"你好世界"; //unicode
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//标准输出句柄 STD_OUTPUT_HANDLE 标准输入句柄 STD_INPUT_HANDLE 标准错误句柄STD_ERROR_HANDLE
WriteConsole(hOut, pszText, wcslen(pszText), NULL, NULL);
}
int main() {
//W_char();//结果:hello wchar 11
//C_char();//结果:hello char
//T_char();
PrintUnicode();
getchar();
return 0;
}