是否有任何区域设置会影响宽字符编码?
Is there any locale that affects wide character encoding?
我没有在标准C++说codecvt
与mbtowc
兼容的标准中找到它。C 标准将mbtowc
指定为
函数确定下一个多字节字符完整且有效,则确定相应宽字符的值,然后,如果pwc不是空指针,则将该值存储在普华永道指向的对象。
但是,"相应宽字符的值"是什么意思?是否受区域设置影响? 宽字的定义说
宽字符
值可由类型为wchar_t
的对象表示,能够表示任何字符 在当前区域设置中。
但后来它将"当前区域设置"重新定义"为实现定义的区域设置。
包含单个宽字符常量的值 映射到扩展执行字符集的单个成员的多字节字符 是对应于该多字节字符的宽字符,由
mbtowc
、mbrtoc16
或mbrtoc32
根据其类型运行,具有实现定义的当前语言环境。
正如这个答案所说,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 实现不同的宽(内部(字符集构建的。
这是对扩展字符的一个很好的介绍。它解释了内部(宽(和外部(多字节(编码背后的基本原理。
- 是否有任何区域设置会影响宽字符编码?
- 字符编码和带有C++的文件名
- C 14:UTF-8/UTF-16与本机字符编码之间的转换
- 如何获取 json 文件的字符编码类型
- 字符编码的自动分配
- 如何正确确定文本文件的字符编码
- 是什么决定了C++中的字符编码
- HttpFile::SendRequest和字符编码
- 从 Linux 到 Windows 交叉编译时,我应该如何处理字符编码
- 如何检查在运行程序的控制台上设置了哪些字符编码
- 在c++中转换字符编码
- 标准::字符串字符编码
- Boost:如何检查文本文件字符编码/字符集
- 流级别的字符编码
- 文件字符编码
- 字符编码独立字符交换
- cURL post字段是用特殊字符编码的
- c++是否支持除UTF-8、UTF-16和UTF-32以外的字符编码之间的转换?
- 字符编码-当读取超过127个ASCII值时,C++cin失败
- gettext字符编码