2010-06-21 31 views
3

這發生在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字符? 有沒有辦法解決這個問題?

回答

5

嘗試顯式設置區域設置爲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

相關問題