是否有任何区域设置会影响宽字符编码?

Is there any locale that affects wide character encoding?

本文关键字:字符 编码 影响 任何 区域 设置 是否      更新时间:2023-10-16

我没有在标准C++说codecvtmbtowc兼容的标准中找到它。C 标准将mbtowc指定为

如果

函数确定下一个多字节字符完整且有效,则确定相应宽字符的值,然后,如果pwc不是空指针,则将该值存储在普华永道指向的对象。

但是,"相应宽字符的值"是什么意思?是否受区域设置影响? 宽字的定义说

宽字符
值可由类型为wchar_t的对象表示,能够表示任何字符 在当前区域设置中。

但后来它将"当前区域设置"重新定义"为实现定义的区域设置。

包含单个宽字符常量的值 映射到扩展执行字符集的单个成员的多字节字符 是对应于该多字节字符的宽字符,由mbtowcmbrtoc16mbrtoc32根据其类型运行,具有实现定义的当前语言环境。

正如这个答案所说,wide-exec-charset与 C 库函数无关,但一些C++ API 如filesystem::path仍然利用它。

现在我真的很困惑,多字节/宽字符转换函数使用的编码是什么?它是依赖于区域设置还是定义的实现?甚至与codecvt的UCS-2或UTF-32相同?

注意:我实际上对C++一无所知,因此我的答案将涉及 C 语言。它还将假设一个glibc系统(这是一个使用GNU C库的系统(。此外,你的问题超出了我的知识范围,所以我会回答你的问题的标题和(大部分(最后一段。


根据 GNU 实现的标准 C 库:

我们在上面已经说过,当前为LC_CTYPE类别选择的区域设置决定了我们将要描述的功能执行的转换。每个语言环境都使用自己的字符集(作为 localedef 的参数给出(,这是假定为外部多字节编码的字符集。宽字符集在 GNU C 库中始终为 UCS-4

回答您的问题:

是否有任何区域设置会影响宽字符编码?

否,因为区域设置不指定宽字符编码,所以它们只指定多字节编码。

多字节/宽字符转换函数使用的编码是什么?

转换函数使用区域设置定义的编码作为多字节编码,使用 UCS-4 作为宽字符编码。

它是依赖于区域设置还是定义的实现?

多字节编码与区域设置相关。宽字符编码是实现定义的。

至于-fwide-exec-charset编译器选项,它仅确定在生成的可执行文件中编码字符文本的宽度。正如这个链接答案所说:当交叉编译具有 C 库实现的系统时,它很有用,该 C 库实现是使用与机器的 glibc 实现不同的宽(内部(字符集构建的。

这是对扩展字符的一个很好的介绍。它解释了内部(宽(和外部(多字节(编码背后的基本原理。