codecvt::max_length在状态依赖编码中的含义及与mbtowc的矛盾疑问
关于codecvt::max_length与MB_CUR_MAX的困惑
查看cppreference上关于max_length的说明时,看到如下注释:
If the encoding is state-dependent (encoding() == -1),
then more than max_length() external characters may be consumed to produce one internal character.
我的理解是:将外部字符序列转换为内部字符时,系统可能会消耗部分外部字符用于切换状态,剩下的部分才用来生成内部字符。
查看libstdc++的实现代码,发现如下片段:
int codecvt<wchar_t, char, mbstate_t>:: do_max_length() const throw() { ... int __ret = MB_CUR_MAX; ... return __ret; }
至少在GCC中,max_length会返回MB_CUR_MAX,libc++的实现也是如此。
但查看C函数mbtowc(用于将字符序列转换为wchar_t)的参考文档时,看到这样的注释:
No more than MB_CUR_MAX characters are examined in any case.
wctomb也有类似的说明。
这让我完全困惑:如果codecvt::max_length等于MB_CUR_MAX,那根据之前的注释,依赖状态的编码可能需要消耗超过max_length()的外部字符才能生成一个内部字符,但为什么mbtowc/wctomb最多只检查/生成MB_CUR_MAX个字符?
内容的提问来源于stack exchange,提问作者Wei Li
相关产品推荐
相关产品推荐

