Bootstrap

string str = “中文lin”不会报错,但为什么还必须使用wstring wstr

在 C++ 中,字符串字面量 "中文lin" 默认是窄字符字符串(char 类型),而不是宽字符字符串(wchar_t 类型)。当你尝试将这个字符串字面量赋值给一个 std::string 对象时,通常不会直接报错,但前提是源文件(.cpp 文件)的编码支持这些字符。

如果你的源文件是以 UTF-8 编码保存的,并且你的编译器(如 GCC、Clang、MSVC 在较新版本中)能够正确处理 UTF-8 编码的源文件,那么 std::string str = "中文lin"; 这行代码是可以正常编译的。这里的 std::string 会将每个 UTF-8 编码的字符(对于中文字符来说,通常是3个字节)作为一个独立的字节序列存储起来。

然而,需要注意的是,虽然这行代码不会报错,但如果你随后尝试以某种方式将 str 当作宽字符字符串来处理(比如传递给期望 wchar_t* 参数的 Windows API 函数),或者期望它能够按照 Unicode 字符边界来分割字符串,那么你就会遇到问题。因为 std::string 并不了解 UTF-8 编码的字符边界,它只是简单地将字节序列存储起来。

如果你确实需要处理 Unicode 字符,并且想要保持字符的边界和编码一致性,那么你应该考虑使用 std::wstring(如果你确定 wchar_t 在你的平台上足够大以存储所需的字符)或者更现代的字符串类型,如 std::u16string 或 std::u32string(C++11 及更高版本),这些类型分别用于存储 UTF-16 和 UTF-32 编码的字符串。

另外,如果你正在使用 C++17 或更高版本,并且想要更灵活地处理字符串(包括 UTF-8 编码的字符串),你可以考虑使用 std::string_view 来引用字符串数据,或者使用第三方库(如 ICU 或 Boost.Locale)来提供更全面的 Unicode 支持。

简而言之,std::string str = "中文lin"; 这行代码本身不会报错,但你需要根据你的具体需求来选择合适的字符串类型。

;