原文發布:http://www.hellocpp.net/Articles/Article/779.aspx
附件也請到這裡去下載, csdn不知道怎麼上傳附件。如果上面的網頁打不開,說明我還沒找到後台管理的密碼,稍後想起來了,文章審核到前台就看到了。
附件地址 http://www.hellocpp.net/Common/Download.aspx?attachment_id=446 。 但願你能下的到。
Android的NDK對unicode支援的非常差,準確說是wide char系列函數支援都很差。很多函式宣告和連結都沒問題,但是不工作,用了以後沒效果。這裡提供一套可以用的寬位元組函數庫。使用非常簡單,對應的函數後面都加 _x 尾碼。
代碼從我的引擎裡出來的,編譯的時候編譯錯誤自己處理下,ds_string 和 ds_wstring改成 string和wstring 就好了。另外,_XEVOL_BASE_API_ 你自己看著辦吧。哈哈。
大部分的函數類似 wcslen的實現是從glibc裡來的,問題不大。
主要是swprintf和swscanf函數。
這兩個函數在glibc裡巨複雜。
這裡介紹一下我的處理方式:
對於swscanf 。我只是用來格式化輸入一些資料的,不會出現輸入字串的現象。於是我是先將它轉成 ansi的字串,調用ansi的sscanf函數來完成。
對於swprintf。 則是自己寫了一個。最終是分段調用sprintf函數。
第二個部分是編碼方式的問題。
在Android低版本中是沒有wcstombs這樣的函數的,你可以編譯過去。但是載入會找到不符號的。
所以,還是別用這樣的函數了。
我們這裡預設使用多位元組編碼是utf-8。所以說。所有的char* 都是utf-8字串。那麼同樣的UnicodeToLocale轉出來的就是utf-8字串。 Locale == utf-8。這個在Linux下也是非常合理的。
這組函數類似如下:
XEvol_UnicodeToLocale
XEvol_Utf8ToUnicode。
這裡utf-8 utf-16(vc下的wchar_t)和utf-32之間的轉換我是扒了iccu的代碼。可信度還是非常高的。
有這一套函數可以徹底的跟iconv說拜拜了。
另外,老衲還是建議,盡量別用swprintf和swscanf這兩個函數,用wstringstring吧。 stlport對這個的支援還是不錯的。