gpt4 book ai didi

c++ - c32rtomb 转换成什么编码?

转载 作者:IT老高 更新时间:2023-10-28 21:47:58 26 4
gpt4 key购买 nike

函数 c32rtombmbrtoc32来自 <cuchar>/<uchar.h>在 C Unicode TR (draft) 中被描述为执行 UTF-321 和“多字节字符”之间的转换。

(...) If s is not a null pointer, the c32rtomb function determines the number of bytes needed to represent the multibyte character that corresponds to the wide character given by c32 (including any shift sequences), and stores the multibyte character representation in the array whose first element is pointed to by s. (...)

什么是“多字节字符表示”?我实际上对以下程序的行为感兴趣:

#include <cassert>
#include <cuchar>
#include <string>

int main() {
std::u32string u32 = U"this is a wide string";
std::string narrow = "this is a wide string";
std::string converted(1000, '\0');
char* ptr = &converted[0];
std::mbstate_t state {};
for(auto u : u32) {
ptr += std::c32rtomb(ptr, u, &state);
}
converted.resize(ptr - &converted[0]);
assert(converted == narrow);
}

其中的断言是否保证保持1


1__STDC_UTF_32__ 的假设下工作已定义。

最佳答案

为了保证断言成立,c32rtomb() 使用的多字节编码必须与用于字符串文字的编码相同,至少与实际使用的字符一样在字符串中。

C99 7.11.1.1/2 指定类别为 LC_CTYPEsetlocale() 会影响字符处理函数以及多字节和宽字符函数的行为。我没有看到任何明确承认效果是设置使用的多字节和宽字符编码,但这就是目的。

所以 c32rtomb() 使用的多字节编码是来自默认“C”语言环境的多字节编码。

C++11 2.14.3/2 指定执行编码、宽执行编码、UTF-16 和 UTF-32 用于对应的字符和字符串字面量。因此 std::string narrow 使用执行编码来表示该字符串。

那么这个字符串的“C”语言环境编码和这个字符串的执行编码一样吗?

C99 7.11.1.1/3 指定“C”语言环境为 C 翻译提供“最小环境”。这样的环境不仅包括字符集,还包括所使用的特定字符代码。所以我相信这不仅意味着“C”语言环境必须支持翻译所需的字符(即基本字符集),而且“C”语言环境中的那些字符必须使用相同的字符代码。

字符串文字中的所有字符都是基本字符集的成员,因此将 char32_t 表示转换为 char "C"语言环境表示必须产生与编译器为 char 字符串文字生成的值序列相同;断言必须成立。

我没有看到任何建议,即执行编码和“C”语言环境之间以兼容的方式支持基本字符集之外的任何内容,所以如果你的字符串文字使用了基本字符集之外的任何字符,那么会有不能保证断言会成立。即使规定了在执行字符集和“C”语言环境中都存在的扩展字符,我看不到表示形式相互匹配的任何要求。

关于c++ - c32rtomb 转换成什么编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13045682/

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