2011-11-25 63 views
0

size_t mbstowcs(wchar_t * dest,const char * src,size_t n);如何正確調用mbstowcs?

我有一些信息使用gb2312編碼,需要在android平臺上更改爲unicode。

1.before調用此方法是否正確setlocale(LC_ALL,「zh_CN.UTF-8」)?

2. how需要分配到dest嗎?

3.傳遞給n的是strlen(src)嗎?

非常感謝。

回答

1

mbstowcs()會將字符串從當前語言環境的多字節編碼轉換爲寬字符字符串。寬字符字符串不一定是unicode,但在Linux上它們是(UCS32)。

如果您將語言環境設置爲zh_CN.UTF-8,那麼當前語言環境的多字節編碼將爲UTF-8,而不是GB2312。您需要設置一個GB2312語言環境,以使用該多字節編碼處理輸入。

C標準意味着單個多字節字符將產生最多一個寬字符,所以可以在寬字符所要求的數量使用strlen(src)作爲上限:

size_t n = strlen(src) + 1; 
wchar_t *dest = malloc(n * sizeof dest[0]); 

(glibc的具有延伸該標準mbstowcs()接口,它允許你傳遞一個NULL指針找出到底有多少寬字符將被轉換生產,但不會幫助你在Android),它的工作原理是這樣的:

size_t n = mbstowcs(NULL, src, 0) + 1; 

應該傳遞的值n是應該通過dest指針寫入的最大寬字符數,包括終止空寬字符。

但是,您應該考慮使用已成功編譯爲Android的libiconv。它允許你明確地選擇你感興趣的源和目標字符集,並且更適合這個問題。

+0

當我測試時,n總是1。你的第一行是什麼意思? – Aaron

+0

@Aaron:對不起,這實際上是'mbstowcs()'的glibc擴展,在Android上不可用 - 我已經更新了答案。 – caf