美文网首页
字符串和字符-Unicode编码

字符串和字符-Unicode编码

作者: Rui哥 | 来源:发表于2018-04-28 13:05 被阅读81次

原文参考:https://www.cnblogs.com/tangjuanj/p/6015806.html

iOS - Unicode编码

  • 一、来历
    为了统一编码,各大龙头企业就决定坐下来对全世界的字符进行编码,并且尽量兼容现有字符集,这就有了unicode编码。Unicode用了21个二进制位,能够编码一百多万个字符,但实际上并没有编码这么多。U+XXXX中XXXX就是码点,就是字符在unicode的数字表示
    编码空间被分成 17 个平面(plane),每个平面有 65,536 个字符0 号平面叫做「基本多文种平面」(Basic Multilingual Plane, BMP),涵盖了几乎所有你能遇到的字符,除了 emoji。其它平面叫做补充平面,大多是空的。
  • 二、UTF-32、UTF-16、UTF-8
    什么字符被表示成什么样子的规定有了,就要考虑怎么存起来了,这就分成了UTF-32、UTF-16、UTF-8三种了。所以UTF-32、UTF-16、UTF-8只是unicode的三种实现方式。

  • 三、UTF-32
    unicode用了21位,那我就用4个字节存,准错不了,这就是UTF-32,由于它的极度浪费,所以基本上没人用。

  • 四、UTF-16
    UTF-16编码介于UTF-32与UTF-8之间,同时结合了定长和变长两种编码方法的特点。UTF-16把字符存储成2个字节或者4个字节。

    具体如下:
    基本平面的字符占用2个字节,辅助平面的字符占用4个字节。也就是说,UTF-16的编码长度要么是2个字节(U+0000到U+FFFF),要么是4个字节(U+010000到U+10FFFF)

    于是就有一个问题,当我们遇到两个字节,怎么看出它本身是一个字符,还是需要跟其他两个字节放在一起解读?

    说来很巧妙,我也不知道是不是故意的设计,在基本平面内,从U+D800到U+DFFF是一个空段,即这些码点不对应任何字符。因此,这个空段可以用来映射辅助平面的字符。

    具体来说,辅助平面的字符位共有2的20次方个,也就是说,对应这些字符至少需要20个二进制位。UTF-16将这20位拆成两半,前10位映射在U+D800到U+DBFF(空间大小210),称为高位(H),后10位映射在U+DC00到U+DFFF(空间大小210),称为低位(L)。这意味着,一个辅助平面的字符,被拆成两个基本平面的字符表示。

  • 五、相当巧妙的UTF-8
    UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。


    UTF-8的编码规则很简单,只有二条:

    • 1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
    • 2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码
UTF8编码格式二进制存储形式 字符 字节数 有效二进制位数
0xxxxxxx 单字节 字符 7位
110xxxxx 10xxxxxx 双字节 字符 11位
1110xxxx 10xxxxxx 10xxxxxx 三字节 字符 16位
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节 字符 19位

举例说明:
已知的unicode是0x4E25(二进制 100 1110 0010 0101),根据上表,可以发现4E25处在第三行的范围内,因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,"严"的UTF-8编码是"11100100  10111000  10100101”,转换成十六进制就是E4B8A5。(即 严的unicode = 0x4E25 ,转换为UTF8 编码后是0xE4B8A5)



iOS - Unicode编码 字面量

字符串字面量可以包含以下特殊字符:

  • **转义字符: \0 (空字符)、 \\ (反斜线)、\t (水平制表符)、\n (换行符)、 \r (回车符)、 \" (双引号)、 \'(单引号)。

  • Unicode标量,写成 \u{n} (u为小写),其中 n任意一到八位十六进制数且可用的Unicode位码

比如:
表情: 💖 =="\u{1F496}" 这两种写法是等价的

举个例子:

  • 获取字符串中每个字符的 Unicode位码
let str1 = "abc\u{1F496}\u{1F497}"
let str2 = "abc💖💗"
print("str1:\(str1)")
print("str2\(str2)")

let str1Scalar =  str1.unicodeScalars   // 相当于是 unicode 的数组
for scalar in str1Scalar{

    print("scalar:\(scalar), scalar value: \(scalar.value)")
}
打印结果
  • 整型Unicode位码 装换成对应的字符
let num : Int = 0x1F497
let numChar = UnicodeScalar(num)
print(numChar!)
打印结果

相关文章

  • Python中的字符串编码

    Python中的字符串编码 定义字符串 Python 中存在两种编码方式的字符串:ASCII 和 Unicode。...

  • 笔记-encode与decode

    字节串-->decode('原来的字符编码')-->Unicode字符串-->encode('新的字符编码')--...

  • day3总结

    1.什么是字符串 2.转义字符 3.Unicode编码 1).将Unicode码转换成字符: chr(编码) 2)...

  • python字符串前面加u,r,b的含义

    u/U:表示unicode字符串 不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码...

  • python字符串前面加u,r,b的含义

    u/U:表示unicode字符串不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码。...

  • python的unicode编码问题(以正则表达式为例)

    unicode是python的内部编码。字符串在Python内部的表示是unicode编码,因此,在做编码转换时,...

  • 2018-11-08

    今天,我们深入学习了字符串。学习了字符串编码: python中的字符采用的是Unicode编码 a.什么是编码 ...

  • 编码问题

    将unicode转换成字符串,即json.dumps(xxx),Python读取的字符串已经是unicode编码,...

  • ECMAScript6新方法(2)

    字符串扩展 ES6加强了对Unicode的支持,并且扩展了字符串对象。 获取字符unicode编码 通过unico...

  • javaScript信息编码转换总结

    一、Unicode编码解码 JavaScript定义了 6 个全局方法用于 Unicode 字符串的编码和解码,说...

网友评论

      本文标题:字符串和字符-Unicode编码

      本文链接:https://www.haomeiwen.com/subject/ybsplftx.html