正确处理字符编码
来源:互联网 发布:农村淘宝的利润是多少 编辑:程序博客网 时间: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
- 正确处理字符编码
- 正确处理字符编码
- 正确处理字符编码
- java读取网页 正确处理字符编码
- 字符编码
- 字符编码
- 字符编码
- 字符 编码
- 字符编码
- 字符编码
- 字符编码
- 字符编码
- 字符编码
- 编码&&字符
- 字符编码
- 字符编码
- 字符编码
- 字符编码
- 回复[请高手解决域名注册搜索器是怎么做的?]
- 计算机十二种常用密码破解法
- Symbian:打造开机自启动程序完整过程
- 怎样获得积分
- 能力(Capabilities)
- 正确处理字符编码
- 001之箭头所指
- 总结开发中的19个问题+若干问题
- 主板维修的一点小常识
- 图片的像素级处理
- IRQ,FIQ区别FAQ
- 揭示常见的重构误区
- 一个SQL语句能够使DB2服务停止
- 两个下拉框的联动功能实现