博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用多字节字符集的跨平台(PC、Android、IOS、WP)编码/解码方法
阅读量:6294 次
发布时间:2019-06-22

本文共 1579 字,大约阅读时间需要 5 分钟。

随着移动端的发展,跨平台已成为通讯架构设计的重要考虑因素,PC、Android、IOS、WP等跨多平台间的数据通讯,必然要解决字符编码/解码的问题。

多字节字符集MBCS不是跨平台的首选字符集,面向跨平台、国际化的推荐字符集肯定是UNICODE。

写VC的人都知道,在以前VC++6.0中默认的字符集是多字节字符集,而VS2005及以后默认的字符集是Unicode,VS2013中默认不再对多字节字符串进行支持。

但对很多较早的服务端项目,依然使用的是多字节字符集,不过使用多字节字符集依然可以实现跨平台数据通信的字符编码/解码。

本着科普的态度,先解释清楚多字节字符集。。。

单字节SBCS:single-byte character set,用一个Byte来编码字符。如:ASCII。

多字节MBCS:multi-byte character set,用多个Byte来编码字符。如Unicode,GBK。

在VC中使用多字节字符集时,在中文Windows上实际使用的是GBK编码,GBK编码是GB2312的一个扩展,向前兼容GB2312并增加2W多个汉字,实际上GB系列包含GB2312、GBK、GB18030三个版本。

下面说下使用多字节字符集的跨平台(PC、Android、IOS、WP)编码/解码方法,只关注字符集的编解码:

服务端:

VC工程设置,使用多字节字符集;

字符串存取使用标准库std::string;

Android端编码/解码:

//解码 ByteBuffer buffer = ByteBuffer.allocate(nDataLen);buffer.put(m_buffer);buffer.flip();String szPacket = Charset.forName("gbk").decode(buffer).toString(); //编码 szPacket.getBytes(Charset.forName("gbk"));

 IOS端编码/解码:

//解码 NSString *szString = [[NSString alloc] initWithData:data encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)]; //编码 [szString dataUsingEncoding:CFStringConvertEncodingToNSStringEncoding (kCFStringEncodingGB_18030_2000)];

WP端编码/解码:

//解码string strData = DBCSCodePage.DBCSEncoding.GetDBCSEncoding("gbk").GetString(byteData, 0, byteData.Length);//编码byte[] byteData = DBCSCodePage.DBCSEncoding.GetDBCSEncoding("gbk").GetBytes(strData.GetString());

Android和IOS的编码/解码相比,Android的解码方式要强壮很多,对于字符串中无法处理的错误字符会自动忽略,而IOS会直接返回nil。

所以对于IOS的字符串处理要特别小心,比如std::string的不正确substr就会导致IOS无法解析。

总体来说使用多字节字符集实现跨平台数据通信是没有问题的,目前主流的Android、IOS、WP三大平台对GB系的字符集支持都是不错的。


 

记录,为更好的自己!

转载于:https://www.cnblogs.com/ym123/p/4254620.html

你可能感兴趣的文章
Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
查看>>
编程之基础:数据类型(二)
查看>>
倒排索引PForDelta压缩算法——基本假设和霍夫曼压缩同
查看>>
java基础--相等
查看>>
记一次网站服务器搬迁实录
查看>>
Sql server restore script(还原数据库正确的步骤)
查看>>
牛客网刷题汇总(一)附解析
查看>>
(转) Deep Learning in a Nutshell: Reinforcement Learning
查看>>
微信说中国人的国庆长假 境内游西湖外滩上榜
查看>>
VR/AR会是微信后马化腾进军的战场吗
查看>>
推荐系统的评分描述
查看>>
Junit测试中找不到junit.framework.testcase
查看>>
SAP HU02 to Unpack for HU, Need Transfer HU to Package Storage Type First.
查看>>
1.3. Getting Started Guides
查看>>
三十而立,立的是什么?(r11笔记第70天)
查看>>
Log4jdbc demo
查看>>
(13)[Xamarin.Android] 不同分辨率下的图片使用概论
查看>>
12.3、Libgdx的图像之截屏
查看>>
什么是PyTorch,为何要使用PyTorch
查看>>
对ESB概念的理解(转)
查看>>