这在OS X上发生,但我怀疑它适用于任何UNIX-y操作系统。 我有两个字符串,如下所示:
const wchar_t *test1 = (const wchar_t *)"\x44\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00"; const wchar_t *test2 = (const wchar_t *)"\x44\x00\x00\x00\x19\x20\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00";
在调试器中,test1看起来像“Ds”,test2看起来像“D's”(带有撇号)。然后我调用这段代码:
wchar_t buf1[100], buf2[100]; int ret1 = swprintf(buf1, 100, L"%ls", test1); int ret2 = swprintf(buf2, 100, L"%ls", test2);
第一个swprintf调用正常。第二个返回-1(缓冲区不变)。
我猜这个问题与语言环境有关,但谷歌搜索并没有为我提供任何有用的东西。这是重现我所看到的问题的最简单方法。我真正感兴趣的是vswprintf(),但我认为这是密切相关的。
为什么swprintf会阻塞8位范围之外的unicode字符? 反正有解决这个问题吗?
答案 0 :(得分:5)
尝试将语言环境明确设置为UTF-8。
setlocale(LC_CTYPE, "UTF-8");
...
const wchar_t* test2 = L"D\x2019s";
int ret2 = swprintf(buf2, 100, L"%ls", test2);
...