一水果砸到牛顿头上,我们汉语用“苹果”描绘,英语用”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干的事情就是编码转换。
如果你想换个比较牛的方式表示字符”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”。
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);
from:http://ioszhidao.tumblr.com/post/67827512937?sukey=389150f5b2134e481d2331741fa43f613193db90904e9cf49417f80cd472a33a8faa85378bf8fe3c399dd598815635a9#wechat_redirect