以下有什么区别吗?
auto s1 = L"你好";
auto s2 = u8"你好";
s1
和s2
指的是同一类型吗?
如果不是,有什么区别?首选哪一个?
L""
创建一个以 null 结尾的字符串,类型为const wchar_t[]
. 这在 C++03 中有效。(请注意,它wchar_t
指的是依赖于实现的“宽字符”类型)。
u8""
创建一个以 null 结尾的 UTF-8 字符串,类型为const char[]
. 这仅在 C++11 中有效。
您选择哪一个在很大程度上取决于您的需求。L""
在 C++03 中工作,因此如果您需要使用较旧的代码(可能需要使用 C++03 编译器编译),您将需要使用它。u8""
在许多情况下更容易使用,特别是当相关系统通常需要char *
字符串时。
第一个是宽字符串,它可能被编码为 UTF-16 或 UTF-32,或者完全是其他的东西(尽管 Unicode 现在很常见,完全不同的编码不太可能)。
第二种是使用 UTF-8 编码的窄字符字符串。
至于哪个是首选:这取决于您在做什么,您正在编码的平台等。如果您主要处理已经编码为 UTF-8 的网页/URL 之类的东西,并且您可能只是将其读入,可能会验证其内容,然后将其回显,也将其存储为 UTF-8 也很有意义。
宽字符串因平台而异。例如,如果您正在为 Windows 编写代码,并且许多代码直接与操作系统(使用 UTF-16)交互,那么将字符串存储为 UTF-16 会很有意义(这就是Microsoft 的编译器用于宽字符串)。