`
wangpengfei360
  • 浏览: 1059269 次
文章分类
社区版块
存档分类
最新评论

关于OC的MBCS编码

 
阅读更多

http协议中,url中的MBCS处理比较复杂。同时涉及到字符集编码和Escape两方面。根据http协议,url中的MBCS(多字节字符集)需要进行Escape(转义)。

但url中的中文不同,它需要向服务器进行提交。

具体地说,对于url中的ascii字符不需要Escape,而对于MBCS字符,需要在16进制字符编码的每一个字节前面加一个%。

除此之外,根据服务器所支持的字符集不同,%号后面的字节要写成对应的编码格式。


例如,一个url中包含一个MBCS字符,中文"哈"。其utf-8的编码值是两个字节: 54 C8,而GBK编码值也是两个字节:B9 FE。那么根据服务器的协议其url应分别编码为:

如果服务器支持的字符集为utf-8,对应的url编码为:http://192.168.1.1/test?content=%54%C8

如果服务器要求采用“GBK"编码,则这个url应编码为:http://192.168.1.1/test?content=%B9%FE

所以,一个含中文的url,是否需要编码,以及采用什么字符集编码,还要根据服务器的具体情况而论。然后再进行Escape。

此外,由于oc本身是用utf-8存储字符的,如果服务器支持utf-8编码,则url中的中文字符不需要任何转换可以直接使用。

在OC中,CFURLCreateStringByReplacingPercentEscapesUsingEncoding和stringByAddingPercentEscapesUsingEncoding两个方法就是专门用于对url中的MBCS进行编码和转义的。

因此,当url地址中含有中文字符时,需要使用如下代码:


+(NSString *) urlEncodeWithGBK: (NSString *) url
{
NSString *result;
NSStringEncoding enc=CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
//先用GBK编码,再url编码
result=[url stringByAddingPercentEscapesUsingEncoding:enc];
return result;
}

@font-face { font-family: "宋体"; }@font-face { font-family: "Cambria"; }@font-face { font-family: "Heiti SC Light"; }@font-face { font-family: "Menlo Regular"; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 10pt; font-size: 12pt; font-family: "Times New Roman"; }div.Section1 { page: Section1; }

想打印一个字符串的 gbk编码,可以用以下代码:

// unicode GBK 编码,因为 o-c 默认使用 unicode NSStringEncoding enc= CFStringConvertEncodingToNSStringEncoding ( kCFStringEncodingMacChineseSimp );

NSData * data=[ @" " dataUsingEncoding :enc];

NSLog ( @" 编码 :%@" ,data);

打印结果为: 编码 :<b9fe> >

如果想打印unicode编码,使用:

NSStringEncoding enc= CFStringConvertEncodingToNSStringEncoding ( kCFStringEncodingMacChineseSimp );

NSData * data=[ @" " dataUsingEncoding : NSUTF16BigEndianStringEncoding ];

NSLog ( @" 编码 :%@" ,data);

其中unicode编码指定为 NSUTF16StringEncoding = NSUnicodeStringEncoding( 二者完全等同 ) ,而所谓 NSUTF16BigEndianStringEncoding 则在 NSUTF16StringEncoding 的基础上另外指定了字节序为big_endian(高位在后)。

打印结果为: 编码 :<54c8>

*注:

big_endian或little_endian来自格列弗游记中小人国的故事。小人国国王曾命令水煮蛋必需由little_end(小的一端)开始剥,而惹恼了喜欢从big_end开始剥的人。于是这两派人被称作little_endian和big_endian 。

在计算机中,big_endian和little_endian分别表示大数在内存中存放字节顺序:高位结尾,低位结尾。

例如,数字 0x11223344(32 位数 ), 这其中位数最高的位是11,位数最低的位是44。这种方式就是以低位结尾,即little_endian。Little_endian是符合人类阅读习惯的。

而在internet中,多使用big_endian,即little_endian的反序(高位结尾)。 数字0x11223344应该表示位0x44332211。 Big_endian可以简单地认为是人类习惯顺序的反序。

由于java使用的字节序一般是big_endian的(这也是internet使用的字节序,称为网络序)。如果o-c要向java发送数据,应该先转为网络序(big_endian)。

NSString有一个defaultCStringEncoding,即默认的字符编码,其值为 30,NSMacOSRomanStringEncoding

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics