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); 
... 
+1

这似乎工作,谢谢。所以...让我们看看我是否理解这里发生了什么。 OS X的缺省语言环境是C,这意味着它使用的ANSI字符集与Basic Latin相同。该卷曲撇号在ANSI中不可表达,因此字符串方法拒绝处理它。通过切换到可以表示任何Unicode字符的语言环境,字符串方法开始工作。 – mhenry1384 2010-06-21 15:46:04