我在使用GCC和Mac OS X的vswprintf
中遇到了莫名其妙的错误(返回值-1)(在Mac OS X 10.6和10.8下使用gcc 4.0和4.2.1进行了测试。Linux下的GCC受到的影响,而不受的影响。VisualStudio也受到的影响)不受影响)。
为了演示该问题,我从here最小化了该示例,以便它打印出vswprintf
的返回值:
/* vswprintf example */
#include <stdio.h>
#include <stdarg.h>
#include <wchar.h>
void PrintWide ( const wchar_t * format, ... )
{
wchar_t buffer[256];
va_list args;
va_start ( args, format );
int res = vswprintf ( buffer, 256, format, args );
wprintf ( L"result=%d\n", res );
fputws ( buffer, stdout );
va_end ( args );
}
int main ()
{
wchar_t str[] = L"test string has %d wide characters.\n";
PrintWide ( str, wcslen(str) );
return 0;
}
根据我的测试,似乎
str
有时会失败,具体取决于vswprintf
的值。例子:wchar_t str[] = L"test string has %d wide characters.\n"; // works
wchar_t str[] = L"ßß® test string has %d wide characters.\n"; // works
wchar_t str[] = L"日本語 test string has %d wide characters.\n"; // FAILS
wchar_t str[] = L"Π test string has %d wide characters.\n"; // FAILS
wchar_t str[] = L"\u03A0 test string has %d wide characters.\n"; // FAILS
似乎任何包含
0xff
上方具有Unicode代码点的字符的字符串都将触发此问题。任何人都可以弄清楚为什么会这样吗?似乎是一个太大的问题,以前从未注意到过! 最佳答案
如果设置语言环境,就可以了。要获取环境变量,您可以执行以下操作:
setlocale(LC_CTYPE, ""); // include <locale.h>
或显式设置。这是因为所有输出函数都需要知道要使用哪种编码。
OS X完全无法执行
vswprintf
,而Linux运行它(尽管如果打印,字符将不正确)。这是glibc文档中的相关部分: