Symbian 關於字元編碼轉換

來源:互聯網
上載者:User
字串編碼中文表示常用的有:GB2312,GBK,Unicode,UTF-8
其中GBK是GB2312的超集,也就是涵蓋了GB2312編碼的所有內容,
UTF-8是Unicode的在網路傳輸中的一種編碼格式,
如果我們使用vc做為開發工具,在win下面進行開發,那麼win
的預設字元集是 GBK的,而symbian系統預設的編碼方式卻是
Unicode,也就是說直接寫在程式裡面的漢字在手機上顯示的時候,
就會變成亂碼。
通常解決這個問題的方法有兩種:
(1)靜態資源檔案解決方案
(2)動態調用字元集轉換函式解決方案

對呀第一種解決方案來說,需要手工編輯rss檔案,把漢字內容部分改為UTF-8格式,
在rss檔案的末尾或者開頭添加:CHARACTER_SET UTF8 即可
缺點是這種字串一般針對靜態資源,如果是那種隨時根據資料變化更新漢字的情況
則需要考慮第二種情況

第二種情況動態轉換字元集的方法

常使用CCnvCharacterSetConverter和CnvUtfConverter這兩個類進行轉化成Symbian系統認識的Unicode編碼.

CCnvCharacterSetConverter類可以進行Symbian支援的所有編碼轉換

CnvUtfConverter這個類常UTF-8與Unicode 和UTF-7與Unicode之間的相互轉換


添加標頭檔
#include <charconv.h> // for char set convert GBK - Unicode
在mmp裡面添加
LIBRARY charconv.lib // for GBK to Unicode converter

這兩步完成後,重新編譯;下面的這兩個函數就可以用了。
void CMcAppUi::ConvGbk2Uni(TDesC8& original, TDes& res) {
#ifndef __WINS__
RFs aFileServerSession;
aFileServerSession.Connect();
CCnvCharacterSetConverter* converter=CCnvCharacterSetConverter::NewLC();

if(converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk,aFileServerSession)!=CCnvCharacterSetConverter::EAvailable)
User::Leave(KErrNotSupported);

TInt state=CCnvCharacterSetConverter::KStateDefault;

TPtrC8 str( original );
HBufC* iInfoText = HBufC::NewL( str.Length() );
TPtr16 ptr = iInfoText->Des();

if(CCnvCharacterSetConverter::EErrorIllFormedInput == converter->ConvertToUnicode(ptr, str, state))
User::Leave(KErrArgument);

res.Zero() ;
res.Copy(ptr) ;
aFileServerSession.Close();
CleanupStack::PopAndDestroy();
delete iInfoText;
#else
res.Format(_L("wayne len %d"), original.Length()) ;
#endif
}

void CMcAppUi::ConvUni2Gbk(TDesC& original, TDes8& res) {
#ifndef __WINS__
TInt state=CCnvCharacterSetConverter::KStateDefault ;
CCnvCharacterSetConverter* iConv ;
iConv = CCnvCharacterSetConverter::NewLC();
if(iConv->PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk,
iEikonEnv->FsSession())!=CCnvCharacterSetConverter::EAvailable)
User::Leave(KErrNotSupported);
iConv->ConvertFromUnicode(res, original, state) ;
CleanupStack::PopAndDestroy() ;
#else
res.Format(_L8("wayne chen %s"), original) ;
#endif
}

具體的使用方法:
TBuf8<20> title8 ;
TBuf<20> title16 ;
TBuf8<20> msg8 ;
TBuf<20> msg16 ;
title8.Format(_L8("友情提示")) ;
ConvGbk2Uni(title8, title16) ;
msg8.Format(_L8(" 謝謝您的使用")) ;
ConvGbk2Uni(msg8, msg16) ;
ShowInfoDialog(title16, msg16) ;
即可,現在title16和msg16裡面都存放的是16位的unicode中文字串了,
可以直接顯示了。
  • 相關關鍵詞:
    相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.