为何MultibyteToWideChar会复制Windows-1253的无效ANSI码点?
MultibyteToWideChar处理Windows-1253无效码点的异常行为
请查看我的代码及运行结果:
void test_MultibyteToWideChar() { WCHAR wbuf[10] = {}; int ret = MultiByteToWideChar(1253, MB_ERR_INVALID_CHARS, "\x98\x99\x9A\x9B\x9C\x9D\xFF", 8, wbuf, 10); }
该代码旨在将部分Windows-1253(希腊文)编码的ANSI字节转换为Unicode。
部分输入ANSI码点(如0x98、0x9A等)无对应字符定义,我原本认为MultibyteToWideChar应返回ERROR_NO_UNICODE_TRANSLATION错误,或至少在输出缓冲区生成U+FFFD(替换字符)。
但实际情况是,MultibyteToWideChar对单个无效码点(如0x98)转换成功,直接将该码点复制到WCHAR缓冲区;仅当输入包含0xFF时才触发错误。我认为这是不合理的行为。
编译环境为VS2019 16.11,运行环境为Win10 1909。


更新
在第一张图中,MultibyteToWideChar返回0表示失败,调用GetLastError()得到错误码1113,即ERROR_NO_UNICODE_TRANSLATION。但该错误是由最后一个输入字节\xFF触发的,而非\x98。单独转换\x98时函数返回成功,我认为这是“虚假成功”。

内容的提问来源于stack exchange,提问作者Jimm Chen
相关产品推荐
相关产品推荐

