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)嗎?
非常感謝。
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)嗎?
非常感謝。
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
。它允許你明確地選擇你感興趣的源和目標字符集,並且更適合這個問題。
當我測試時,n總是1。你的第一行是什麼意思? – Aaron
@Aaron:對不起,這實際上是'mbstowcs()'的glibc擴展,在Android上不可用 - 我已經更新了答案。 – caf