文章目录
  1. 1. 文档更新说明
  2. 2. 前言
  3. 3. 读取NSString和String的内容
    1. 3.1. 字符串长度
  4. 4. 推荐阅读

文档更新说明

  • 最后更新 2018年03月12日
  • 首次更新 2018年03月12日

前言

  本文用于记录我在使用这两者过程中的一些想法,不包含所有内容.
  另外要知道一点基础知识: Unicode是字符集,类似一部字典,里面说明了每一个字符对应的编码数值; 而UTF8,UTF16全称是Unicode Transformation Format,就是Unicode的编码格式.编码格式规定了把Unicode字符存储在物理存储上(简单说就是磁盘SSD等)的格式.   

读取NSString和String的内容

字符串长度

  NSString的数据存储格式为UTF–16, 我们平时使用的length属性, 返回的值就是字符串采用UTF–16编码的时候所需要的编码单元(code units)数量,而不一定是人类可见字符串的实际字符个数.请看下面例子:

1
2
3
4
5
NSString *str = @"Cafe\u0301 du 👍";
NSLog(str); //直接打印出来就是"Café du 👍",所以人类可读的字符就是9个(包括2个空格)
//得到长度11, 这是因为该字符串采用UTF16编码格式时,é是2个单元, 👍也是2个单元
printf("%d", str.length); //11

  我们在Swift里面做同样的事情,看看会有什么区别

1
2
3
4
5
6
7
8
9
let cafe: String = "Cafe\u{301} du 👍"
print(cafe) //直接打印得到 Café du 👍
//由于Swfit的count属性是计算CharacterView中元素的数量(The number of elements in the collection),
//而CharacterView就是一个人类可读的字符collection,所以会得到数量为9(包括2个空格)
print(cafe.count) //9
//如果想得到UTF16编码的单元数量,写法如下
print(cafe.utf16.count) //11, 这个数量就跟NSString的length一致了

  这里还需要注意一个地方,String中有一个属性是unicodeScalars, 方法解释A string’s unicodeScalars property is a collection of Unicode scalar values, the 21-bit codes that are the basic unit of Unicode. Each scalar value is represented by a Unicode.Scalar instance and is equivalent to a UTF-32 code unit, 简单说就是unicodeScalars的内容跟UTF32一样……

推荐阅读

NSString 正确遍历字符个数方式

文章目录
  1. 1. 文档更新说明
  2. 2. 前言
  3. 3. 读取NSString和String的内容
    1. 3.1. 字符串长度
  4. 4. 推荐阅读