当你在处理文本时,如果你不是在写一些非常古老的代码(legacy code),那么你一定要使用 Unicode。幸运的是,苹果和 NeXT 一直致力于推动 Unicode 标准的建立,而 NeXT 在 1994 年推出的 Foundation Kit 则是所有编程语言中最先基于 Unicode 的标准库之一。但是,即使 NSString 完全支持 Unicode,还替你干了大部分的重活儿,处理各种语言、各种书写系统的文本仍然是一个非常复杂的事情。作为一个程序员,有些事情你应该知道。

这篇文章里,我会先向你简单地讲一下 Unicode 这个标准,然后解释 NSString 是怎么处理它的,再讨论一下你可能会遇到的一些常见问题。

历史

计算机没法直接处理文本,它只和数字打交道。为了在计算机里用数字表示文本,我们指定了一个从字符到数字的映射。这个映射就叫做编码(encoding)

最有名的一个字符编码是 ASCII。ASCII 码是 7 位的,它将英文字母,数字 0-9 以及一些标点符号和控制字符映射为 0-127 这些整型。随后,人们创造了许多不同的 8 位编码来处理英语以外的其他语言。它们大多都是基于 ASCII 编码的,并且使用了 ASCII 没有使用的第 8 位来编入其它字母、符号甚至是整个字母表(比如西里尔字母和希腊字母)。

当然,这些编码系统相互之前并不兼容,并且,由于 8 位的空间对于欧洲的文字来说都不够,更不用说全世界的书写系统了,因此这种不兼容是肯定会出现的了。这对于当时基于文本的操作系统来说是很麻烦的,因为那时操作系统只能同时使用一种编码(也叫做内码表,code page)。如果你在一台机器上写了一段文字,然后在另一台使用了不同的内码表的机器上打开,那么在 128-255 这个范围内的字符就会显示错误。

诸如中文、日文和韩文的东亚文字又让情况更加复杂。这些书写系统里包含的字符实在是太多了,以至于 8 位的数字所能提供的 256 个位置远远不够。结果呢,人们开发了更加通用的编码(通常是 16 位的)。当你开始纠结于如何处理一个字节装不下的值时,如何把它存储到内存或者硬盘里就变得十分关键了。这时,就必须再进行第二次映射,以此来确定字节的顺序。而且,最好使用可变长度的编码而不是固定长度的。请注意,第二次映射其实是另一种形式的“编码”。我们把这两个映射都叫做“编码”很容易造成误解。这个在下面 UTF-8 和 UTF-16 的部分里会再作讨论。

现代操作系统都已经不再局限于只能同时使用一种内码表了,因此只要每个文档都清楚地标明自己使用的是哪种编码,处理几十甚至上百种编码系统尽管很讨厌,也完全是有可能的。真正不可能的是在一个文档里混合使用多种编码系统,因此撰写多语言的文档也不可能了,而正是这一点终结了在 Unicode 编码出现之前,多种编码混战的局面。

1987 年,来自几个大的科技公司(其中包括苹果和 NeXT)的工程师们开始合作致力于开发一种能在全世界所有书写系统中通用的字符编码系统,于 1991 年 10 月发布的 1.0.0 版本的 Unicode 标准就是这一努力的成果。

Unicode 概要

基本介绍

简单地来说,Unicode 标准为世界上几乎所有的[^1]书写系统里所使用的每一个字符或符号定义了一个唯一的数字。这个数字叫做码点(code points),以 U+xxxx 这样的格式写成,格式里的 xxxx 代表四到六个十六进制的数。比如,U+0041(十进制是 65)这个码点代表拉丁字母表(和 ASCII 一致)里的字母 A;U+1F61B 代表名为“伸出舌头的脸”的 emoji,也就是

iOS 中的编码方式详解(主要讲解Unicode)相关推荐

  1. iOS中MVC等设计模式详解

    iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...

  2. php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念 js里常用的如下 - phpStudy...

    JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...

  3. 字符常见的编码方式详解

    字符常见的编码方式 本人是做嵌入式开发的,当初第一次接触MDK时,被一个问题疑惑过,那就是在keil中的汉字注释复制到别的地方会出现乱码,还有编代码的时候,总会选择UTF-8编码方式.带着这些疑问我在 ...

  4. Java中文字编码问题详解

    JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应用中.网上的分析文章和解决方案都很多,但总是针对某些特定情况的.很多次遇到乱码问题后,经过极为辛苦的调试和搜索资料后终于解决,满以为自己已经掌 ...

  5. 各种音频编码方式详解

    内容简介:文章介绍了PCM编码.WMA编码.ADPCM编码.LPC编码.MP3编码.AAC编码.CELP编码等,包括优缺点对比和主要应用领域. PCM编码(原始数字音频信号流) 类型:Audio 制定 ...

  6. Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解

    1 ASCII American Standard Code for Information Interchange.最早最通用的单字节编码系统,因为发明时间早,所以ASCII编码表的设计较为简单. ...

  7. 计算机编码方式详解(Unicode、UTF-8、UTF-16、ASCII)

    整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的"另存为",可以在GBK.Unicode.Unicode big endian和UTF-8这几种编码方式间相互转 ...

  8. Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码

    将字符转换为二进制码的过程,我们称为编码,将二进制码转换为字符的过程,我们称为解码. 编码和解码时所采用的规则,我们称为字符集 常见的字符集: ASCII - 美国人编码,使用7位来对美国常用的字符进 ...

  9. 【基础知识】深度学习中各种归一化方式详解

    本文转载自 https://blog.csdn.net/qq_23981335/article/details/106572171 仅作记录学习~ 总结 BN,LN,IN,GN,WS 从学术上解释差异 ...

最新文章

  1. 字符串处理stringr包在微生物生态的应用基础
  2. Java开发面试题及答案,5年crud“经验
  3. JS组件系列——表格组件神器:bootstrap table
  4. 建立丰富多彩的toast的简单实例
  5. 从入门到放弃之大数据Hive
  6. ithoughts怎么自定义样式_Word 表格样式,用过的人可能都会遇到这个问题
  7. 【Java】Java多线程神器:join使用及原理
  8. Virtio原理简介
  9. 逆幂律模型_【微微出品】加速模型一起聊聊Peck、Lawson、MILHDBK217
  10. html table 转置,jQuery+CSS实现的table表格行列转置功能示例
  11. 使用kubeadm安装部署k8s
  12. 9.企业安全建设入门(基于开源软件打造企业网络安全) --- SOC系统建设
  13. Python教你找到最心仪的对象
  14. Podfile 文件模板
  15. 在Linux安装QQ,只需几步
  16. matlab使用xlsread读取excel时报错/错误使用xlsread/matlab读取数据莫名其妙的错误
  17. 人工智能如何被用于造福人类?
  18. linux磁盘怎么分区,linux磁盘分区,linux磁盘分区怎么划分
  19. 不积跬步无以至千里,不积小流无以成江海
  20. 台式计算机的硬件故障,电脑主板坏了会出现什么情况?台式机电脑主板常见故障解决方法...

热门文章

  1. 近观趣店,“审视”罗敏
  2. 抖音恶心的整人代码~~~VBS代码
  3. 初识 Mac机子 关机命令
  4. python控制苹果手机触摸屏失灵怎么办_苹果手机触摸屏失灵的各种解决方法
  5. ESXI 6.7全面系统教程~esxi安装win10
  6. Oozie 工作流定义详解【转】
  7. 深度:年收入超百亿元的恒源祥已成中老年服饰品牌?快速老龄化下中国传统服装品牌的危机与机会
  8. Mybatis多表关联查询之三表查询
  9. 零基础学彩铅——下午茶(含详细步骤)
  10. 拼多多直通车推广做好关键性的一步:商品标题如何引流?