3

这发生在 OS X 上,尽管我怀疑它适用于任何 UNIX-y 操作系统。我有两个看起来像这样的字符串:

常量 wchar_t *test1 = (常量 wchar_t *)"\x44\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00";
常量 wchar_t *test2 = (常量 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 字符?有没有办法解决这个问题?

4

1 回答 1

5

尝试将语言环境显式设置为 UTF-8。

setlocale(LC_CTYPE, "UTF-8");
...
const wchar_t* test2 = L"D\x2019s";
int ret2 = swprintf(buf2, 100, L"%ls", test2);
...
于 2010-06-21T15:12:22.253 回答