您所看到的称为 Unicode。或者更具体地说:UTF-16。又名“宽弦”。每个字符是 16 位(2 字节)而不是 8 位。
默认情况下,大多数 Visual C++ 程序编译时默认启用 UNICODE。在与 Windows API 交互时,只需坚持使用 Unicode 16 位字符串并使用 wchar_t* 和 std::wstring 代替 char* 和 std::string。
甚至还有一个用于宽字符串的 wregex 库。
您的代码中的错误是您明确地将
buf
转换为 LPTSTR。你可能这样做了,因为那是它能够编译的原因。
更好:
wchar_t buf[MAX] = {};
GetDlgItem(hwnd, IDC_EDIT_FLD, buf, MAX);
如果您需要在 ascii 和宽字符串之间进行转换,Windows 提供了 API:MultiByteToWideChar 和 WideCharToMultiByte。
如果你想用 ascii 字符串调用 Windows API,你可以显式地使用“A”变种:
char buf[MAX] = {};
GetDlgItemA(hwnd, IDC_EDIT_FLD, buf, MAX);
或者“W”品种,反正是默认的:
wchar_t buf[MAX] = {};
GetDlgItemW(hwnd, IDC_EDIT_FLD, buf, MAX);
正如我在上面的评论中指出的那样,LPTSTR 和相关的 TCHAR 类型是 Windows 编程的古老遗迹,需要从地球上抹去。它使 Windows 9x 程序能够使用 ASCII API 支持进行编译,而 Windows NT 程序能够被编译为 Unicode。除非您有将代码移植到 Windows 98 的要求,否则您不需要使用 TCHAR 类型。