字符编码的那些事

欢迎关注”iOS开发之道”的微博和微信帐号,一起交流学习。
微博:iOS开发之道 微信:ioszhidao

image



什么是字符集?

  一水果砸到牛顿头上,我们汉语用“苹果”描绘,英语用”apple”表示。每个字符集可以类比为一个自然语言。常见的字符集有ASCII、Unicode、GB2312、Big5等,跟我们自然语言中的汉语、英语、日语等多种语言一样。每个字符集定义了字符与编码的映射表。其中ASCII字符集比较基础,所有其它的字符集都包含了ASCII字符集。比如ASCII码中0x41表示字符‘A’,在所有其它字符集中同样如此,当然在Unicode中是0x0041。


什么是字符编码?

  字符编码等价于字符集吗?我们经常会看见ASCII编码、GBK编码等。字符集和字符编码看起来是一回事,其实不一样。字符集只是定义了1个数字和1个字符之间的映射关系,但是如何表示这个数字呢?1个字节、2个字节还是3个字节?这些就需要一套编码规则。比如Unicode字符集下有UTF-8, UTF-16, UTF-32等多种字符编码。

具体大家去查看相关资料,这里难以全面概括。

大头和小头?

  “endian”一词来源于乔纳森·斯威夫特的小说格列佛游记。小说中,小人国为水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开而争论,争论的双方分别被称为“大端派”和“小端派”。
字节序引用这个典故分为两种:
1. big-endian
  最高位字节存储在最低的内存地址处,比如0x1234的存储顺序为0x12 0x34
2. little-endian
  最低位字节存储在最低的内存地址处,比如0x1234的存储顺序为0x34 0x12
显而易见big-endian符合我们的思维习惯,在计算机中字节序由处理器决定x86是小端序、Motorola 6800是大端序、ARM可以配置字节序,网络中网络字节序由网络协议决定,一般是大端序。 当你想把1个int16转成2个char或者通过网络传输的时候,就得注意字节序的问题了。大家可以去看看union类型及hton等转换函数。
在Unicode文件的读写中也采用了字节序的概念,通过在文件开头加入特定字节表示编码类型,比如: 

什么是乱码?

MM:”阿栋,给你看一篇文章”
阿栋:”看不懂阿,1个字都不认识”
MM:“不好意思,原来你不懂日文”
对于阿栋来说,这篇文章就是乱码,因为他不懂日文。
同样如果你把GB2312编码的文章给浏览器显示,但是恰好该浏览器不支持GB2312,或者你是的浏览器选择的编码是UTF-8,或者你的Gb2312中夹杂了UTF-16的字符,那么最终显示就会出现乱码。

什么是编码转换?

MM:”阿栋,你再看看” 阿栋:”我看不懂呀” MM:”没事儿,我翻译成中文了”
阿栋:”哇,好厉害”
MM干的事情就是编码转换。

\x, \u, \U啥意思?

  如果你想换个比较牛的方式表示字符”A”, “\x41”,在这里\x是对41的16进制转义,表示字符0x41,而不是两个字符’4’和’1’。\x到处都可以用,但是\u,\U只能在unicode系列编码中才能用。
\u表示对后面2个字节(16位)进行转义,\U转义4个字节(32位)。前缀u8表示UTF-8, u表示UTF-16,U表示UTF-32。比如”A”可以表示为u8”\x41”,u”\u0041”,U”\U00000041”。

Cocoa中的相关技术点

1.NSString
Cocoa提供了很多NSString与NSData及C字符串(char*)之间的转换方法
2.unichar
在内存中处理字符串都会转成NSString格式,NSString是UTF-16编码,其中2个byte的unichar表示字符。
3.组合字符(Composed Character)
比如café中的é,系统提供了专门处理组合字符的方法。
4.Emoji字符
Emoji字符转成UTF-8会是几个字节?答案是4. 因此搞windows平台的童鞋都在这里栽了跟头,还有搞mysql的童鞋也得注意^-^。
5.编码转换
iconv是一个比较常用的编码转换工具,libiconv库提供转换函数。在Cocoa中我们如果想把GB2312转成Unicode处理,可以用下述方式:

 NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_2312_80);
 NSString *str = [[NSString alloc] initWithBytes:gb2312Str length:strlen(gb2312Str) encoding:encoding];   

6.获取汉语拼音

NSMutableString *pinyin = [str mutableCopy];  
//转换成拼音  
CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO);  
//去掉音标  
CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripDiacritics, NO);   

欢迎关注”iOS开发之道”的微博和微信帐号,一起交流学习。
微博:iOS开发之道 微信:ioszhidao

image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值