正确处理字符编码

来源:互联网 发布:农村淘宝的利润是多少 编辑:程序博客网 时间:2024/04/27 16:15

正确处理字符编码

中文的编码常用的有3种格式:1)gb2312(就是ascii码方式,也说ansi) 2)unicode 3)utf-8
c++一般采用ancii码,而java一般采用unicode,而SymbianC++(以后简称symbian)采用unicode或utf-8
比如汉字“好”: unicode为“7D 59”,而ascii为“BA C3”, utf-8编码为3个字节。

当然,终端你可以选择使用char *, unsigned char *, 但是这不是推荐使用的,很多时候处理的时候如界面等需要转化为终端的字符编码格式。

现在分4部分讲解字符编码转化(例子假设,java和symbian间采用utf-8,c++和symbian之间采用ASCII码):

1) Symbian -> Java 发送含有中文的消息  
   我们假设你的Symbian的发送消息的接口采用的是HBufC8 * (utf-8)
   那么你在发送你的消息之前,需要将数据转化为utf-8格式,
   例如,你可以使用CnvUtfConverter::ConvertFromUnicodeToUtf8()将界面的TBuf转化为8位的utf-8格式,转化过程中你要尤其注意,为HBufC8 * 开辟的内存应该是TBuf长度的2倍!
   至于终端如何处理Java端发送的消息就不言而喻了,Java通常会只发送一个String, 也就是一个Unicode字符串,这个时候一般Symbian会以TDes8接收,实际上接收的数据是Unicode的而不是utf-8的,但是Symbian支持这种格式,所以可以直接就按这种方式处理,而不需要转化。当然,要在界面上显示的话还是需要CnvUtfConverter::ConvertToUnicodeFromUtf8())  

2) Java -> Symbian 发送含有中文的消息
   服务器端当然也要处理中文了,刚才已经说了,发送的时候你可以直接发送String (Unicode),让Symbian去解析,但是接收就得十分小心!!终端Symbian过来的是HBufC8* (utf-8)格式,Java切忌不要直接用String去接收,需要按字节接收,然后再将这些字节解析成utf-8,再转化为String,有几条简单的语句可以完成这个操作:
   byte b3[] = ...; //来自Symbian的utf-8字节
   DataInputStream dis=new DataInputStream(new ByteArrayInputStream(b3));
   String chinastring = dis.readUTF();

3) Symbian -> C++ 发送含有中文的消息
   现在我们再来讨论下,如何将Symbian的消息发送给C++子系统呢, 显然,C++子系统是按照char */unsigned char *处理字符串的,也就是ASCII码方式(中文就是扩展的ANSI即GB2312)。
   虽然笔者在项目中没有用到Symbian到C++传送中文,但是以下两个函数足可以让你轻松许多。
   TPtrC8 aPtrString(iSomeBuf)
   char* aCharString = (char*)aPtrString.PtrZ()
   C++ 系统收到这样的消息后当然是坐想砌成,不用任何转化了。

4) C++ -> Symbian 发送含有中文的消息
   C++发送还是以char* ASCII发送。
   终端接收这可有点麻烦了啊!!这种方式终端尤其要小心, 比如发送消息如果有TUint8的消息头,需要将其先去掉,然后再将剩下的转化为16位unicode,这样界面就可以显示了,如果要按照8位处理那么请再用一下CnvUtfConverter::ConvertFromUnicodeToUtf8()函数就可以了。
  void ConvUnicodeL(const TDesC8& aText, TDes16& UnicodeText, TUint8 CodeType)
  {
        CCnvCharacterSetConverter* aConverter = CCnvCharacterSetConverter::NewLC();
 TUint code;
 code = KCharacterSetIdentifierGbk; 
 if (aConverter->PrepareToConvertToOrFromL(code,
     CEikonEnv::Static()->FsSession()) != CCnvCharacterSetConverter::EAvailable)
     User::Leave(KErrNotSupported);
 TInt state=CCnvCharacterSetConverter::KStateDefault; 
 const TInt returnValue=aConverter->ConvertToUnicode(UnicodeText, aText, state); 
 if (returnValue==CCnvCharacterSetConverter::EErrorIllFormedInput)
  User::Leave(KErrCorrupt);
 else if (returnValue < 0)
  User::Leave(KErrGeneral);
 CleanupStack::PopAndDestroy();
 TInt loc = UnicodeText.Locate(0);  // 去掉后面多余的0
 if (loc != KErrNotFound)
 {
  UnicodeText.Delete(loc, UnicodeText.Length() - loc);
 }
        //如果还要转化为utf-8就在此处加行代码CnvUtfConverter::ConvertFromUnicodeToUtf8()  
}
  
现在回想是不是很麻烦呢,正确,以上的处理方式对于终端来说确实很麻烦。
试想做一些规定:
1) 所有系统之间的消息用utf-8传送,Symbian也许就会笑了,谢谢各位, C++可能很迷茫,Java稍微转化下.
2) 所有系统之间的消息用ASCII码, C++也许就会笑了,呵呵,我一直用char *, Symbian的处理确实较为麻烦些,Java稍微转化下.
3) 所有系统之间的消息用Unicode, Java也许就会笑了,你们早该这样了, Symbian也还乐意, 可神仙知道C++如何转化.

 

http://blog.csdn.net/meteor0627/archive/2007/06/08/1644290.aspx

原创粉丝点击