Symbian OS应用-中文支持

来源:互联网 发布:好用的浏览器 知乎 编辑:程序博客网 时间:2024/05/28 01:36
 

在Symbian程序用户界面上的中文,如果是直接通过程序输出的部分,例如给字符串赋值为中文,则可直接显示。但是更多的时候用户界面是通过资源文件中定义,Symbian资源文件存储在一个以rss为扩展名的文件中,界面上元素的文本,例如菜单项文本,按钮文本等都是在这个文件中定义。但是这个文件并不支持中文的显示,你如果直接把文本改成中文,那么编译后程序执行就会是乱码。虽然不支持中文,但是可以用UNICODE来显示中文的信息,我们只需要在rss文件头加入 CHARACTER_SET UTF8 一行,然后把所有的中文文本UNICODE替换即可。也就是说必须使得我们的资源文件支持Unicode,然后用相应中文的Unicode赋值给相应的字符串。

但是怎么得到一个中文对应的UNICODE文本串呢?最简单的方法就是使用我们的文本编辑工具,比如EmEditor,使用的方法是先在Ansi编码方式下写下我们需要的中文,然后将其另存为Unicode的文本,再次打开时就会发现里面的文本变成了Unicode,把这个字符串拷到我们的.rss文件中即可。

如果是程序中需要处理中文字符串,比如Sms的内容等等,这时只要记住Symbian OS中对Unicode的支持比较好,所以我们只需要将需要处理的文本统一使用Unicode进行编码即可。当然这时就需要对英文字符进行相应处理了,因为英文字符只是简单的由1byte变为2byte,高字节使用00代替,这个和中文的编码方式有所不同。

 

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;

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击