swprintf 在 8 位范围之外的字符上被阻塞

2024-02-01

这种情况发生在 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 字符而阻塞? 有办法解决这个问题吗?


尝试将区域设置显式设置为 UTF-8。

setlocale(LC_CTYPE, "UTF-8");
...
const wchar_t* test2 = L"D\x2019s";
int ret2 = swprintf(buf2, 100, L"%ls", test2);
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

swprintf 在 8 位范围之外的字符上被阻塞 的相关文章

随机推荐