隨著移動端的發展,跨平台已成為通訊架構設計的重要考慮因素,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端的代碼沒在手邊,有需要的可以私信我。
Android和IOS的編碼/解碼相比,Android的解碼方式要強壯很多,對於字符串中無法處理的錯誤字符會自動忽略,而IOS會直接返回nil。
所以對於IOS的字符串處理要特別小心,比如std::string的不正確substr就會導致IOS無法解析。
總體來說使用多字節字符集實現跨平台數據通信是沒有問題的,目前主流的Android、IOS、WP三大平台對GB系的字符集支持都是不錯的。
記錄,為更好的自己!