在symbian中显示中文
2010-02-21 10:34
176 查看
中文字符编码常用的表示法有: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
(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
相关文章推荐
- symbian 上中文显示的一些连接
- Symbian 显示中文资源
- Symbian程序中显示资源中定义的中文
- Qt For Symbian 程序标题显示中文的方法
- symbian S60 3rd的中文菜单显示
- Symbian中文显示问题-转贴
- Symbian本地化显示中文
- symbian如何显示中文
- symbian中文显示的两大解决方案:静态和动态
- 在symbian中显示中文
- Symbian中文显示问题
- Symbian 显示中文资源
- symbian 模拟器 中文显示
- symbian中文字符串显示问题的解决
- 关于SymbianSeries 60开发的中文显示问题
- symbian中文字符串显示问题的解决(转载)
- Symbian中文显示问题
- Symbian 中文显示
- Symbian程序中显示资源中定义的中文
- Symbian中显示中文汉字(3种方法)