字符、Unicode和字符串
高清教学视频在Swift里,我们使用String来表示字符串类型,它是一个Character类型的集合。在开始具体的编码之前,我们先来了解一些关于字符编码的知识。
字符编码就是把各种字符按照一定标准,转换成计算机可以识别的数字的过程。例如,在我们熟悉的ASCII编码中:
字符 | ASCII编码 |
A | 0x61 |
$ | 0x24 |
除了ASCII编码外,还有很多处理其它语言文字的编码。在维基百科我们可以看到,即便是“常用的字符编码”,就有图中显示的那么多种:
![](https://dn-boxueio.qbox.me/bo-reading-wikipeida-encoding@2x.jpg)
其中,有处理中文的GBK/GB2312,有处理西欧文字的ISO8859,有处理日文的JIS X。这些编码方式,可以帮助计算机方便的工作在双语言环境里。但是,却不能帮助我们的计算机解决多语言环境工作的问题。我们用汉字“泊”来举个例子:
汉字 | 编码集 | 编码值 |
泊 | GBK | 0xB2B4 |
泊 | BIG5 | 0xAA79 |
泊 | GB2312 | 0xB2B03 |
泊 | JIS X | 0x4777 |
可以看到,同一个汉字“泊”,在不同的字符集里的编码值是不一样的。这使得计算机在多语言环境里,处理文本变得非常复杂。因此,国际上开始推行一种叫做Unicode的标准,它使用统一的编码规则对几乎我们使用的所有文字、字符和符号进行了统一编码。而Swift中的String对象,就是完全基于Unicode构建的。
String的初始化
我们可以像下面这样,初始化一个空的字符串:
//: #### String init
let emptyString = ""
let emptyString1 = String()
也可以使用type inference给字符串赋值:
//: #### String init
var swift = "Swift is fun."
“在Swift里,String对象是否允许被修改,只取决于我们使用let或var来定义。而不像Objective-C中,需要我们使用NSString和NSMutableString来分别定义。”
特别提示
String是一个value type
和Objective-C不同,Swift中的String是一个值类型,当我们把一个String对象赋值给其它变量的时候,Swift会完整复制字符串的内容,而不仅仅是复制一个指向原有字符串的引用。
var swift = "Swift is fun."
// String - value type
let swiftCopy = swift // Copy on write
print(swift)
当然,Swift对字符串的拷贝操作进行了优化,我们只有在后面的代码真正修改字符串的时候,拷贝操作才真的发生。
String中的字符: Character
String中的每一个字符都是一个Character对象,我们可以这样单独定义它们:
//: Character
let charA: Character = "A"
let charB = "B"
我们可以访问String对象的characters属性来遍历字符串中的每一个字符:
//: Character
for char in swift.characters {
print(char)
}
我们还可以使用一个Character数组来初始化一个String对象:
let swiftInChar: [Character] = ["S", "w", "i", "f", "t"]
let swift1 = String(swiftInChar)
除此之外 ,String对象还支持通过+直接进行拼接,生成新的String对象:
let swift2 = swift + swift1
String interpolation
我们可以通过在字符串中插入\(expression),把expression的值直接插入字符串。在Swift里,这就叫做string interpolation,来看个例子:
//: String interpolation
// \(expression)
let PI = 3.14
var message = "PI equals to \(PI)"
message = "PI * 100 equals to \(PI * 100)"
// \ CR LF
使用string interpolation有一些限制,我们不能够在String中插入回车和换行。以上,就是全部和字符串初始化有关的内容,在进一步了解String的各种操作之前,我们要先补充一些Unicode知识。
Unicode
Unicode Scalar
Unicode使用一个21-bit的整数,几乎对我们使用的所有字符采用统一的格式进行了编码,像这样:
![](https://dn-boxueio.qbox.me/bo-reading-unicode-table@2x.jpg)
从图中我们就可以看到,不同的字符集合在Unicode中占用了不同的取值范围。访问 http://unicode-table.com/en/ 点击其中一个字符,就可以查看详细信息了:
![](https://dn-boxueio.qbox.me/bo-reading-unicode-info@2x.jpg)
在上图中,我们可以看到,字符B有一个名字"Latin Capital Letter B",还有一个unicode number: U+4402。事实上,每个unicode字符都会有一个对应的name和number,我们管这个number,就叫做unicode scalar。
“并不是21-bit所有整数空间都被分配了字符,unicode scalar并不包含U+D800-U+DFFF之间的值,它们叫做unicode surrogate pair code points。“
特别提示
在Swift里,我们可以这样:
\u{unicode scalar}
来使用unicode scalar。
// Unicode Scalar
let blingHeart = "\u{1F496}"
blingHeart.dynamicType
![](https://dn-boxueio.qbox.me/bo-reading-sparkling-heart-output@2x.jpg)
从图中的结果,我们就可以看到,blingHeart是一个String,值是