You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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。

VS2019调试结果

Windows-1253字符表

更新

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

单独转换\x98字节

内容的提问来源于stack exchange,提问作者Jimm Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:01:02