windows编程 为什么要用宽字节
为什么在宽字节Windows中所有的底层函数都是Unicode编码?C++语言中“_T”是什么意思?让我们来探讨一下这些问题。一.多字节字符在Windows操作系统中,所有的底层函数都是Unicode编码的,这意味着它们使用宽字符集来处理文本。这是因为Unicode编码能够支持更广泛的字符集,包括各种语言的字符,从而避免了不同字符集之间可能产生的乱码问题。例如,在Windows下小端存储的情况下:charc='A';//内存中对应字节41wchar_twc=L'A';//内存中对
为什么在宽字节Windows中所有的底层函数都是Unicode编码?C++语言中“_T”是什么意思?让我们来探讨一下这些问题。
一. 多字节字符
在Windows操作系统中,所有的底层函数都是Unicode编码的,这意味着它们使用宽字符集来处理文本。这是因为Unicode编码能够支持更广泛的字符集,包括各种语言的字符,从而避免了不同字符集之间可能产生的乱码问题。
例如,在Windows下小端存储的情况下:
char c = 'A'; // 内存中对应字节 41 wchar_t wc = L'A'; // 内存中对应字节 41 00 char cs[] = "AB"; // 内存中对应字节 41 42 00 wchar_t ws[] = L"AB"; // 内存中对应字节 41 00 42 00 00 00
Windows中的底层函数,如GetWindowTextW,是Unicode编码的:
GetWindowTextW(
_In_ HWND hWnd,
_Out_writes_(nMaxCount) LPWSTR lpString,
_In_ int nMaxCount
);
#ifdef UNICODE
#define GetWindowText GetWindowTextW
#endifCOM组件也必须使用Unicode编码,因为它们通常用于代码重用。
Windows API中有宽字符和窄字符两个版本,例如FindWindowW和FindWindowA,其中W表示宽字符,A表示ASCII字符。Windows.h中定义了UNICODE宏,底层调用宽字符版本,而窄字符版本仅用于编码转换。

二. C++语言中的“_T”是什么意思?
在C++中,_T用于定义字符串时保证兼容性。Visual C++支持ASCII和Unicode两种字符类型,使用_T可以确保从ASCII编码转换到Unicode编码时,程序无需修改。
如果不打算升级到Unicode编码,那么不需要使用_T。
三. 多字节字符
基于ASCII的GB2312标准:
- ASCII表:0 ~ 127
- 拓展ASCII表:0 ~ 255
- GB2312:10000000 ~ 11111111(高位) + 10000000 ~ 11111111(低位)
不同国家的字符集可能会导致乱码问题。
基于Unicode的UTF-8:
- Unicode(同一码/万国码):通常称作UCS-2,每个字符2个字节,但只能表示最多65536个字符。UCS-4或UTF-32可以定义更多字符。
- UTF-8:是Unicode的一种可变长度字符编码。
四. C语言中的宽字符使用
在C语言中,wchar_t表示宽字符,使用L告知编译器使用Unicode表。例如:
wchar_t x1 = L'中';
使用GB2312编码:
char x[] = "中国";
使用Unicode编码:
wchar_t x1[] = L"中国";
在控制台打印时,注意编码问题:
char x[] = "中国";
wchar_t x1[] = L"中国";
printf("%s\n", x); // 使用控制台默认的编码
wprintf(L"%s\n", x1); // 默认使用ASCII码表解码,可能出现乱码要正确打印宽字符,需要设置控制台编码:
#includesetlocale(LC_ALL, ""); // 使用控制台默认的编码
五. C语言宽字符操作函数
在使用宽字符函数时需要注意,例如:
char x[] = "中国"; wchar_t x1[] = L"中国"; cout << x << endl; // 输出多字节字符 wcout << x1 << endl; // 输出宽字符
六. 字符串转换
MFC下的常用字符串数据类型:
- L: Long(长)
- P: Point(指针)
- C: Const(常量)
- W: Wchar_t(宽字符)
- T: TCHAR
- STR: String(字符串)
MFC提供的ATL转换宏:
- T2A, T2W, T2CA, T2CW, W2A, W2CA, W2T, W2CT, A2W, A2CW, A2T, A2CT
这些宏定义在atlconv.h头文件中,使用时需要添加USES_CONVERSION;宏。注意在循环中使用时可能导致栈溢出,因此要注意:
- 只适合短字符串转换
- 避免在次数多的循环体内转换
- 不要对大文件内容进行转换
- 对大文件和循环中的转换使用
MultiByteToWideChar()和WideCharToMultiByte()
七. 打印信息的方式
在Windows编程中,可以使用以下方式打印信息:
int a = 10;
TRACE("a == %d", a);
CString s;
s.Format(CString("a == %d"), 20);
AfxMessageBox(s);
MessageBox(TEXT("111"), NULL, NULL, NULL);
#define log(fmt, ...) \
CString str; \
str.Format(CString(fmt), __VA_ARGS__); \
AfxMessageBox(str);
void CPVZCheartDlg::OnBnClickedButton1() {
int a = 10;
log("a == %d", a);
}
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















