为什么在MSVC2017中codecvt_utf8_utf16::do_max_length()返回6? 为什么Visual C++ 2017实现STD::CODECVTTUTF8UTF16::doxMax?长度()返回6(假设CODEVTTHOME模式为0)?< /P> //类codecvt\u utf8\u utf16 模板 类编码VT\U utf8\U utf16 :公共编解码器 {//UTF-16 _元素和UTF-8字节序列之间转换的方面 // ... 虚拟整数CLR\u或此调用do\u max\u length()常量THROW0() {//返回转换所需的最大长度 返回((\u Mymode&consume\u header)!=0?9//header+最大输入 :(_Mymode&generate_header)!=0?7//头+最大输出 :6);//最大6字节输入序列,无3字节头 }

为什么在MSVC2017中codecvt_utf8_utf16::do_max_length()返回6? 为什么Visual C++ 2017实现STD::CODECVTTUTF8UTF16::doxMax?长度()返回6(假设CODEVTTHOME模式为0)?< /P> //类codecvt\u utf8\u utf16 模板 类编码VT\U utf8\U utf16 :公共编解码器 {//UTF-16 _元素和UTF-8字节序列之间转换的方面 // ... 虚拟整数CLR\u或此调用do\u max\u length()常量THROW0() {//返回转换所需的最大长度 返回((\u Mymode&consume\u header)!=0?9//header+最大输入 :(_Mymode&generate_header)!=0?7//头+最大输出 :6);//最大6字节输入序列,无3字节头 },c++,utf-8,utf-16,C++,Utf 8,Utf 16,是否应该改为4(在UTF-8中编码任何Unicode代码点,最多需要4个字节)?有一个版本的UTF-8,编码一个代码点最多可以使用6个字节。可能出于某种原因,Microsoft会使用它。它还将处理输入流包含无效代码点(>U+10FFFF)的情况。然后像承诺的那样发出超过4个字节的声音。必须这样做,它不能使流处于不一致的状态。但不会故意生成无效的代码点,这就是它返回7的原因。@HansPassant“流”是什么意思C++的I/O流或字符输入序列,用于CODEVVT DOIIN/DOOUT方法?当输

是否应该改为4(在UTF-8中编码任何Unicode代码点,最多需要4个字节)?

有一个版本的UTF-8,编码一个代码点最多可以使用6个字节。可能出于某种原因,Microsoft会使用它。它还将处理输入流包含无效代码点(>U+10FFFF)的情况。然后像承诺的那样发出超过4个字节的声音。必须这样做,它不能使流处于不一致的状态。但不会故意生成无效的代码点,这就是它返回7的原因。@HansPassant“流”是什么意思C++的I/O流或字符输入序列,用于CODEVVT DOIIN/DOOUT方法?当输入doAuin/doSUTE包含无效的代码点时,它们应该返回<代码>结果:错误< /代码>,并且不跳过/忽略无效数据。有一个UTF-8版本,可以使用最多6字节来编码代码点。也许微软使用了这个代码。某些原因。它还将处理输入流包含无效代码点(>U+10FFFF)的情况。然后按照承诺发出超过4个字节的声音。它必须这样做,它不能使流处于不一致的状态。但不会故意生成无效代码点,这就是它返回7的原因。@HansPassant“stream”是什么意思- CODDEVT DOIIN/DOOUT方法的C++ I/O流或字符输入序列?当doAuin /doSUTE的输入包含无效的代码点时,它们应该返回<代码>结果::错误< /C> >,并且不跳过/忽略无效数据。
        // CLASS codecvt_utf8_utf16
template<class _Elem,
    unsigned long _Mymax = 0x10ffff,
    codecvt_mode _Mymode = (codecvt_mode)0>
    class codecvt_utf8_utf16
    : public codecvt<_Elem, char, _Statype>
    {   // facet for converting between UTF-16 _Elem and UTF-8 byte sequences

    // ...

    virtual int __CLR_OR_THIS_CALL do_max_length() const _THROW0()
        {   // return maximum length required for a conversion
        return ((_Mymode & consume_header) != 0 ? 9 // header + max input
            : (_Mymode & generate_header) != 0 ? 7  // header + max output
            : 6);   // 6-byte max input sequence, no 3-byte header
        }