上一篇关于这个话题讲到了总结法则,这篇就来具体看一看吧!
第一,要将一串的字节翻译成人类理解的字位。首先必须要知道原始编码。
第二,在Unicode中字位非代码点,非字节,这个是非常重要的,因为在很多语言中,字符串操作库只对字节生效。在ASCII中没问题,因为字位与字节一一对应,Unicode中就不行了,这个例子是Python2的原生字符串,len()函数返回字符串中字节数即4,而不是字位或者代码点的1,此外如果我们查看字符串索引,得到点赞表情每个代码点的UTF-8字节,其实没有什么用,这些函数称为“Unicode不知所云/un'',因为他们操纵字节,却不知背后含义,你可能更希望用代码点来索引字符,要实现就要用到u指定符,使其成为可识别的Unicode字符串,这样len()和索引就是我们要的了,来看另一个例子:点赞结合如上色块,一个字位两个代码点,应该像这样,但我的终端实际无法正确渲染,使用len(s)得到8,因为两个代码点每个占四字节,当我们使用u(),得到代码点长度为2。
很严肃的事情,因为天真的操纵字符串中字节内容可以很容易出现乱码。来看看ellipsis函数,文本太长就会截断变为...,如果用unicode的un函数,可能会多算字符串的长度。因为计算字节而不是代码点,第二你可能会在代码点中间切断字符串,破坏字符串。如果你用u函数,会得到一个更准确的计数。但依旧无法很好处理混合修饰符,也可能在中间切断。
如果你想按照人类可感知单元处理字位,你可能要用到一个特殊的库,知道点赞修改颜色后是一个字位,我鼓励大家用最喜欢的编程语言,尝试使用其他字符串函数,去看他们如何处理复杂的字位,像点赞结合颜色的修改器,来再增加一条总结。
第三,使用un函数,只当每个字位是一个字节,这仅是ASCII情况。UTF-8中也只有ASCII字符,使用u()来操控代码点,为了更准确的字符串操控和长度计算,最后可以使用可识别字位的字符串函数,最大精确的来处理用户可感知的字符,停在点赞表情的代码点页面,看到页面中的名字,代码点值0x1f44d,十进制128077,以及不同的编码策略下的编码,以及UTF-8/32和并未讨论的UTF-16,如果你之前也对Unicode困惑,希望现在可以清楚一些,最后给大家一个彩蛋,关于一些资料的分享,加微信领取资料。
。