贝利信息

C++如何处理宽字符(wchar_t)和std::wstring?

日期:2026-01-07 00:00 / 作者:裘德小鎮的故事
C++宽字符(wchar_t)非通用Unicode类型,Windows用UTF-16(16位),Linux/macOS用UTF-32(32位),跨平台不可移植;应优先选用UTF-8编码的std::string或第三方库处理Unicode。

在C++中处理宽字符(wchar_t)和std::wstring,核心是理解其设计目的、平台差异与实际使用限制。它主要用于支持Unicode(但不是UTF-8),尤其在Windows API或需要处理本地化宽字符串的场景中;但在跨平台项目中,更推荐用char8_t + UTF-8 或第三方库(如utf8cpp、icu)。

宽字符不是“通用Unicode类型”

wchar_t的大小和编码含义由编译器与平台决定:

这意味着sizeof(wchar_t)不可移植,std::wstring也不能跨平台直接序列化或网络传输。别假设L"€".length() == 1——在Windows上它可能是2(代理对),在Linux上是1。

输入输出需匹配locale和流类型

std::wcoutstd::wcin前必须设置正确的全局locale,否则可能输出乱码或静默失败:

与C风格字符串和API交互要小心转换

Windows API大量使用LPCWSTR(即const wchar_t*),而POSIX函数基本不接受wchar_t*。转换时避免手写循环:

切勿用reinterpret_castchar*wchar_t*间强制转换——编码不同,字节布局不兼容。

替代方案更实用

除非必须对接Windows GUI或COM接口,否则优先考虑:

宽字符体系在C++标准中功能有限、平台行为分裂,现代项目中它更多是“遗留互操作层”,而非首选文本抽象。