Swift字符Unicode编码
可扩展的字符群集可以组成一个或者多个 Unicode 标量。这意味着
不同的字符以及相同字符的不同表示方式可能需要不同数量的内存空间来存储
。所以Swift 中的字符在一个字符串中并不一定占用相同的内存空间数量
。因此在没有获取字符串的可扩展的字符群的范围时候,就不能计算出字符串的字符数量。如果您正在处理一个长字符串,需要注意characters属性必须遍历全部的 Unicode 标量,来确定字符串的字符数量
。
字符串Unicode标量的特殊字符
//字符串字面量的特殊字符
let dollarSign = "\u{24}" // $, Unicode 标量 U+0024
let blackHeart = "\u{2665}" // ♥, Unicode 标量 U+2665
let sparklingHeart = "\u{1F496}" // 💖, Unicode 标量 U+1F496
let unicodeStrEg = "这个字符串有点儿特殊,你看到的长度不一定是真的\u{1F496}" // 💖, Unicode 标量 U+1F496
//获取字符串的长度()
let sparklingHeart_l = sparklingHeart.count
print("sparklingHeart字符串的长度:\(sparklingHeart_l)")
//打印输出:sparklingHeart字符串的长度:1
for char in sparklingHeart {
print("遍历结果:\(char)")
//打印输出: 遍历结果:💖
}
print("\(dollarSign)\n\(blackHeart)\n\(sparklingHeart)\n\(unicodeStrEg)")
//打印输出:
/*
$
♥
💖
这个字符串有点儿特殊,你看到的长度不一定是真的💖
*/
这就说明
NSString的length属性是利用 UTF-16 表示的十六位代码单元数字,而不是 Unicode 可扩展的字符群集。
不同的字符可能会占用不同数量的内存空间,所以要知道Character的确定位置,就必须从String开头遍历每一个 Unicode 标量直到结尾。因此,Swift 的字符串不能用整数(integer)做索引。
可扩展的字形群集
//可扩展的字形群集
let eAcute: Character = "\u{E9}" // é
let combinedEAcute: Character = "\u{65}\u{301}" // e 后面加上
// eAcute 是 é, combinedEAcute 是 é
print("eAcuteValue:\(eAcute),combinedEAcuteValue:\(combinedEAcute)")
//打印输出: eAcuteValue:é,combinedEAcuteValue:é
UTF-8 编码
let unicodeString = "好好学习,天天向上"
//UTF-8 编码:
for code in unicodeString.utf8 {
print("UTF-8 编码:\(code) ")
//打印输出:
/*
UTF-8 编码:229
UTF-8 编码:164
UTF-8 编码:169
UTF-8 编码:229
UTF-8 编码:144
UTF-8 编码:145
UTF-8 编码:228
UTF-8 编码:184
UTF-8 编码:138
*/
}
UTF-16 编码
//UTF-16 编码:
let unicodeString = "好好学习,天天向上"
for code in unicodeString.utf16 {
print("UTF-16 编码:\(code) ")
//打印输出:
/*
UTF-16 编码:22909
UTF-16 编码:22909
UTF-16 编码:23398
UTF-16 编码:20064
UTF-16 编码:65292
UTF-16 编码:22825
UTF-16 编码:22825
UTF-16 编码:21521
UTF-16 编码:19978
*/
}
网友评论