8位范围以外的字符上的swprintf扼流圈
问题描述:
这发生在OS X上,尽管我怀疑它适用于任何UNIX-y操作系统。 我有一个看起来像这样两个字符串:8位范围以外的字符上的swprintf扼流圈
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的”(与花撇号)。然后我打电话给这个代码:
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);
...
这似乎工作,谢谢。所以...让我们看看我是否理解这里发生了什么。 OS X的缺省语言环境是C,这意味着它使用的ANSI字符集与Basic Latin相同。该卷曲撇号在ANSI中不可表达,因此字符串方法拒绝处理它。通过切换到可以表示任何Unicode字符的语言环境,字符串方法开始工作。 – mhenry1384 2010-06-21 15:46:04