Symbian Series60下显示汉字

1.       SDK开发包中的模拟器显示汉字问题.

只有中文版本的SDK中的模拟器才能显示汉字(自带字库除外)。

如果是英文版本的模拟器,直接显示GB的汉字编码,除开显示的汉字为小方块外,程序还会出现异常错误。

英文版本的模拟器,比如SDK 1.2上显示汉字唯一的办法就是自带字库或者画图。这样的办法虽然比较复杂,但是在移植的时候方而轻松了。而且不用为不同机型字体大小变化而发愁。

中文版本的模拟器,比如SDK 2.1C, 模拟器是支持直接显示GB的汉字编码的。不过实际的机器上还是不能显示出来。因为Symbian针对文字的都是Unicode编码。必须要转换而才能显示。

2.  在真实手机上显示汉字。

虽然在makesis中的pkg文件中可以选择安装语言,比如英文EN,中文ZH,但是这个安装选项其实根本没有任何用处。Symbian采用的是Unicode编码,它只看你的Unicode编码,不看其它的。所以要解决汉字问题,必须转换我们的汉字编码。

转换的办法分为静态转换和动态转换:

静态转换:

在RSS资源文件里面定义

RESOURCE TBUF64 r_example_view_title { buf = "新年快乐";}

然后将其用WORD转换成UTF8编码,在此RSS文件头部添加CHARACTER_SET UTF8,否则无法编译,然后在程序里面调用,就能显示中文了。

在你的程序里面,首先得include系统根据rss文件生成的rsg头文件,里面包含了

#define R_EXAMPLE_VIEW_TITLE                      0x24da2006

然后在程序中,使用下面这个函数来创建资源

HBufC* CCoeEnv::AllocReadResourceL(TInt aResourceId) const

这种办法显然不是很好,因为所有的文字资源都放在了RSS资源文件,如果我们的程序有自己的资源文件来存放文字就不好办了。

Windows98过后,Windows就提供了关于Unicode的转换的API函数可以调用。我们可以自己写个程序,转换针对文字的UTF8转换。下面就是这两个Windows API

MultiByteToWideChar

WideCharToMultiByte

下面是我自己写的一个转换函数。

typedef struct _Utf8

{

     u16   len;

     char  string[MAX_CHAR]; // 不包括字符串长度

}Utf8;

//

// desc :把一个常规字符串转换成一个utf8编码的字符串

Utf8* utf8_convert(const char *string)

{

     char utf8[10*MAX_CHAR];

     WCHAR wstr[10*MAX_CHAR];

     int wsz;

     int utf8sz;

     Utf8 *pUtf8;

 

     wsz= MultiByteToWideChar(CP_ACP, 0, (const char*)string,(int)strlen(string)+1,wstr,sizeof(wstr)/sizeof(wstr[0]) );

     utf8sz= WideCharToMultiByte(CP_UTF8, 0, wstr, -1,utf8, sizeof(utf8), NULL, NULL );

 

     pUtf8 = (Utf8*)malloc(sizeof(Utf8));

     strcpy(pUtf8->string,utf8);

     pUtf8->len = (u16)(utf8sz-1);

     return pUtf8;

}

动态转换:

Symbian 自从5.1后过,就提供了Unicode转换的API。下面是我整理的一个转换的函数,直接粘贴过去就可以用了。

注意,本段程序需要增加头文件charconv.h和库文件charconv.lib

HBufC16* CAppView::ConvertToUnicode(TText* text)

{

     // CcnvCharacterSetConverter API来转换

     CCnvCharacterSetConverter* converter=CCnvCharacterSetConverter::NewLC();

     if(converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk, iCoeEnv->FsSession())!=CCnvCharacterSetConverter::EAvailable)

         User::Leave(KErrNotSupported);

     TText8 *str = (TText8*)text;

     TInt state=CCnvCharacterSetConverter::KStateDefault;

     TPtrC8 source( str );

     HBufC16* iInfoText = HBufC16::NewL(source.Length()*2);

     TPtr16 ptr = iInfoText->Des();

     if(CCnvCharacterSetConverter::EErrorIllFormedInput == converter->ConvertToUnicode(ptr, source, state))

         User::Leave(KErrArgument); //Leave if error in conversion.

     CleanupStack::PopAndDestroy(); //clean for converter

 

     //delete converter;

     return iInfoText;

}

用法示例

TText8  *str = (TText8 *)"陈青";

HBufC16* msg = ConvertToUnicode(str); //调用转码,str类型为ttext8*

note->ExecuteLD(*msg);

delete msg;                        //记得一定要删除,否则会出现内存泄漏

msg = NULL;

 

//

#ifndef _tounicode_h_
#define _tounicode_h_
//forward declarationwww.muzhiquan.com4l.K4u'B3v:U+H
class CCnvCharacterSetConverter;
class RFs;
#include <e32def.h>
class ToUnicode
{
public:
 ToUnicode();
 virtual ~ToUnicode();
public:
 static HBufC16* Convertl(TText* aorigin);
};
#endif // !defined(tounicode_h_)

 

#include <charconv.h>  //所要的lib:charconv.lib 
#include <f32file.h>   //link against: efsrv.lib
#include <e32std.h>
#include <coemain.h>   //link against: cone.lib
#include "tounicode.h"

//
// construction/destruction
//
ToUnicode::ToUnicode()
{

}
ToUnicode::~ToUnicode()
{

}
HBufC16* ToUnicode::Convertl(TText* aorigin)
{
//创建一个转换器且转换器放入清除栈
 CCnvCharacterSetConverter* converter=CCnvCharacterSetConverter::NewLC();

 RFs fsession;
//需要打开文件服务器
 User::LeaveIfError(fsession.Connect());
//判断传入的源字符串是否gbk\gb2123码
 if(converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierGbk,
  fsession)!=CCnvCharacterSetConverter::EAvailable)
  {
   //如果不是gbk\gbk2123码就退出
   fsession.Close();
   CleanupStack::PopAndDestroy(); //clean for converter
   //CleanupStack::Pop(converter);
   //delete converter;
   User::Leave(KErrNotSupported);
  }
 TText8 *str = (TText8*)aorigin;
 TInt state=CCnvCharacterSetConverter::KStateDefault;
 TPtrC8 source( str );
 HBufC16* iInfoText = HBufC16::NewL(source.Length()*2);
 TPtr16 ptr = iInfoText->Des();
 if(CCnvCharacterSetConverter::EErrorIllFormedInput == converter->ConvertToUnicode(ptr, source, state))
  User::Leave(KErrArgument); //Leave if error in conversion.
 fsession.Close();
 CleanupStack::PopAndDestroy(); //clean for converter
 return iInfoText;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值