技术开发 频道

Symbian中的字符串问题解决方案

  【IT168 技术】相信大家都在处理symbian中文显示的时候遇到了这种问题, 我现在就给总结一下这种问题的解决方法:字符串编码中文表示常用的有: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 // 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中文字符串了,

  可以直接显示了。

  希望堆大家的开发有所帮助。

0
相关文章