• 关于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

  • 相关阅读:
    html头部属性全接触
    js中的window.onload和jquery中的load区别
    关机时,自动清除运行框的记录的设置方法
    MVC问题小总结,不断更新中...
    iis6 元数据库与iis6 配置的兼容 出错问题
    MVC对异步 Controller 的支持
    SQL Server2008安装报错,解决方案
    JavaScript有5个原始类型
    ASP.NET MVC中的拦截器
    F5负载均衡
  • 原文地址:https://www.cnblogs.com/encounter/p/2188499.html
Copyright © 2020-2023  润新知