vsnprintf 文档中"encoding error"的含义是什么?

What is the meaning of "encoding error" in the vsnprintf documentation?

本文关键字:是什么 error 文档 encoding vsnprintf      更新时间:2023-10-16

在 vsnprintf 的C++在线文档中,有说明

 If an encoding error occurs, a negative number is returned.

在这种情况下,"编码错误"是什么意思,是否可以举例说明这种错误?

正如格林奇指出的那样,它指的是字符串编码错误。我们可以用这个代码重现一个负返回值,因为调用 wctomb 时,129 是日语 (932) 代码页中无效的宽字符:

int call_vsnprintf(char* buf, int max, char* format, ...)
{
    va_list args;
    va_start(args, format);
#pragma warning (suppress : 4996)
    int result = vsnprintf(buf, max, format, args);
    va_end(args);
    return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, ".932");
    char dest[100];
    wchar_t wbuf[2];
    wbuf[0] = 129;
    wbuf[1] = 0;
    //this will be -1
    int result = call_vsnprintf(dest, sizeof(dest), "%ls", wbuf);
}

注意:这是在Windows上,但如果它不是可移植的,可以通过在亚洲代码页中搜索强制wctomb返回-1的宽字符来轻松修复。

感谢谷歌网上论坛上的詹姆斯·凯珀(James Kuyper)提供了几乎完整的答案。

让我确认一下 Debian Millie Smith 的回答:

char dest[100];
wchar_t wbuf[2];
wbuf[0] = 129;
wbuf[1] = 0;
int result = snprintf(dest, sizeof(dest), "%ls", wbuf);

结果为 -1。