R. *_*des 21 c++ unicode c++11
这些函数c32rtomb和mbrtoc32来自C Unicode TR(草案)中的<cuchar>/ <uchar.h>描述为执行UTF-32 1和"多字节字符" 之间的转换.
(...)如果
s不是空指针,则该c32rtomb函数确定表示与由c32(包括任何移位序列)给出的宽字符对应的多字节字符所需的字节数,并将多字节字符表示存储在数组中,第一个元素是指向的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);
}
Run Code Online (Sandbox Code Playgroud)
它中的断言是否保证保持1?
1在__STDC_UTF_32__定义的假设下工作.
bam*_*s53 10
为了保证断言保持为真,所使用的多字节编码c32rtomb()必须与用于字符串文字的编码相同,至少就字符串中实际使用的字符而言.
C99 7.11.1.1/2指定setlocale()类别LC_CTYPE会影响字符处理函数的行为以及多字节和宽字符函数.我没有看到任何明确的确认,即效果是设置所使用的多字节和宽字符编码,但这是意图.
因此,使用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"语言环境中都存在的扩展字符,我也没有看到表示相互匹配的要求.
在问题中链接的TR说
最多
MB_CUR_MAX存储字节.
它被定义为(在C99中)
一个正整数表达式,其类型
size_t是当前语言环境指定的扩展字符集的多字节字符中的最大字节数
我相信这足以证明TR的意图是生成当前安装的C语言环境定义的多字节字符:UTF-8 en_US.utf8,GB18030 zh_CN.gb18030等.
| 归档时间: |
|
| 查看次数: |
703 次 |
| 最近记录: |