在symbian中顯示中文

來源:互聯網
上載者:User

 中文字元編碼常用的標記法有:GB2312,GBK,Unicode,UTF-8,其中GBK是GB2312的超集,也就是涵蓋了GB2312編碼的所有內容,UTF-8是Unicode的在網路傳輸中的一種編碼格式,如果我們使用vc做為開發工具,在win下面進行開發,那麼win的預設字元集是 GBK的,而symbian系統預設的編碼方式卻是Unicode,也就是說直接寫在程式裡面的漢字在手機上顯示的時候,就會變成亂碼。

(1)靜態資源檔案解決方案
(2)動態調用字元集轉換函式解決方案

 

      對於第一種解決方案來說  

      首先,我們在loc檔案的開頭加入下面的這行代碼
    CHARACTER_SET UTF8

  第二步,在loc檔案中定義你需要的字串資源,如下
    #define qtn_exam_caption "中文示範"
  
  第三步,把編輯的這個檔案儲存為UTF8格式,這步很關鍵,否則你的程式顯示可是亂碼。
  特別提示,把該loc檔案儲存UTF8格式,這個檔案的開頭會加入3個位元組的檔案頭,我們需要把這個loc檔案用二進位的方式開啟,把前3個位元組的檔案頭刪除掉,可以用vc6以二進位的方式開啟進行前3個位元組的刪除或UE16進位開啟,S60 3rd SDK下是必須要這麼做的。

  第四步,在rss定義字串資源,如下
    RESOURCE TBUF32 r_exam_caption { buf=qtn_title_main_view; }

  最後,我們就可以在程式中使用中文了,使用方式如下:
    HBufC* pFormat=StringLoader:oadLC(R_EXAM_CAPTION);
    ... ... ...                    //現在就可以使用你的中文字串的資源了
    CleanupStack:opAndDestroy();  //使用後,別放了釋放資源,否則會有記憶體泄露哦。

 

第二種情況動態轉換字元集的方法
添加標頭檔
#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中文字串了.

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/lmyuanhang/archive/2009/10/09/4646115.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.