首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 第二书店 程序员
您的位置:Mobile->字符串编码中文表示问题处理方法

字符串编码中文表示问题处理方法2007-09-24 来自:lizhe1985  [收藏到我的网摘]

来源:soar_xie的专栏 - CSDNBlog

  符串编码中文表示常用的有: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 即可。缺点是这种字符串一般针对静态资源,如果是那种随时根据数据变化更新汉字的情况则需要考虑第二种情况。

  第二种情况动态转换字符集的方法

  添加头文件

#include <charconv.h> // for char set convert GBK - Unicode

  在mmp里面添加

LIBRARY charconv.lib // for GBK to Unicode converter

  这两步完成后,重新编译;下面的这两个函数就可以用了。

void CPLMMAppUi::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 CPLMMAppUi::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(" 谢谢您使用PLMM软件")) ;
ConvGbk2Uni(msg8, msg16) ;
ShowInfoDialog(title16, msg16) ;

  即可,现在title16和msg16里面都存放的是16位的unicode中文字符串了,可以直接显示了。

推荐人评论

如果我们使用vc做为开发工具,在win下面进行开发,那么win的默认字符集是 GBK的,而symbian系统默认的编码方式却是Unicode,也就是说直接写在程序里面的汉字在手机上显示的时候,就会变成乱码。

用户评论

正在载入评论列表...

是谁推荐了此篇文章

专家头像李哲
个人blog发送信息
李哲推荐的其他文章

赞助商精华文章

热点新闻

热点评论

    精彩视频

    精彩专题

    网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|版权声明|问题报告

    北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright 2000-2008, CSDN.NET, All Rights Reserved
    GongshangLogo