gpt4 book ai didi

c++ - 以 L 开头的宽字符串文字(如 L“Hello World”)是否保证以 Unicode 编码?

转载 作者:IT老高 更新时间:2023-10-28 23:03:44 32 4
gpt4 key购买 nike

我最近试图全面了解创建支持 unicode 的独立于平台的 C++ 应用程序需要哪些步骤。令我困惑的一件事是,大多数操作指南和内容都将字符编码(即 ANSI 或 Unicode)和字符类型(char 或 wchar_t)相等。正如我目前所了解到的,这些是不同的东西,可能存在一个用 Unicode 编码但由 std::string 表示的字符序列,以及一个用 ANSI 编码但用 std::wstring 表示的字符序列,对吧?

所以我想到的问题是,C++ 标准是否对以 L 开头的字符串文字的编码提供任何保证,或者它只是说它是 wchar_t 类型,具有实现特定的字符编码?

如果没有这样的保证,这是否意味着我需要某种外部资源系统以独立于平台的方式为我的应用程序提供非 ASCII 字符串文字?这样做的首选方式是什么?资源系统或源文件的正确编码以及正确的编译器选项?

最佳答案

字符串文字前面的 L 符号仅表示字符串中的每个字符都将存储为 wchar_t。但这并不一定意味着 Unicode。例如,您可以使用宽字符串对 GB 18030 进行编码。 ,在中国使用的一种字符集,类似于Unicode。 C++03 标准对 Unicode 没有任何规定(但是 C++11 定义了 Unicode char types and string literals ),因此您可以在 C++03 中正确表示 Unicode 字符串。

关于字符串字面量,C++ 标准的第 2 章(词汇约定)提到了一个“基本源字符集”,它基本上等同于 ASCII。所以这基本上保证了 "abc" 将被表示为一个 3 字节的字符串(不包括 null),而 L"abc" 将被表示为一个 3 * sizeof(wchar_t)-byte 宽字符字符串。

该标准还提到了“通用字符名称”,它允许您使用 \uXXXX 十六进制表示法来引用非 ASCII 字符。这些“通用字符名称”通常直接映射到 Unicode 值,但标准不保证它们必须如此。但是,您至少可以通过使用通用字符名称来保证您的字符串将被表示为特定的字节序列。如果运行时环境支持 Unicode、安装了适当的字体等,这将保证 Unicode 输出。

至于 C++03 源文件中的字符串文字,同样不能保证。如果您的代码中有一个 Unicode 字符串文字,其中包含 ASCII 范围之外的字符,则由您的编译器决定如何解释这些字符。如果您想明确保证编译器将“做正确的事”,则需要在字符串文字中使用 \uXXXX 表示法。

关于c++ - 以 L 开头的宽字符串文字(如 L“Hello World”)是否保证以 Unicode 编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810343/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com