编码原理理解之「UTF-8」

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编码原理理解之「UTF-8」相关的知识,希望对你有一定的参考价值。

参考技术A

UTF-8 (8位元, Universal Character Set/Unicode Transformation Format )是针对Unicode的一种可变长度字符编码。它可以用来表示 Unicode 标准中的任何字符,而且其编码中的第一个字节仍与 ASCII 相容,使得原来处理 ASCII 字符的软件无须或只进行少部份修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。

总结下来, UTF8 有如下特点:
1)是 unicode 的一种实现方式;
2)是一种变长编码标准;
3)可以与 ASCII 码有效兼容;
4)应用超级广泛编码标准。

我们讲, UTF-8 unicode 的一种实现方式,那么,想要对一个字符进行 UTF-8 编码,首先我们要知道这个字符的 unicode 编码(字符的 unicode 编码是约定好的,全球统一不变的)。拿 unicode 编码的方式很简单,网上有很多 工具 可以做到。

接下来针对不同的 unicode 符号范围, utf-8 编码实际占用的字节数可能 1~4 字节不等👇

总结下来,针对 UTF8 ,编码规则其实只有两条:
1) 单字节规则: 对于 单字节 的符号,字节的第一位(最高位)设为 0 ,后面 7 位为这个符号的 unicode 码。
2) n字节规则: 对于 n 字节的符号( n>1 ),第一个字节的前 n 位都设为 1 ,第 n+1 位设为 0 ,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 unicode 码。

「真」 举例,我们查到 「真」 unicode 编码是 \\u771f \\u 只是 unicode 的编码标记,其后面跟的还是 16 进制数),发现真的编码范围是 0x0800 ~ 0xffff 间,故选择 3字节 的编码方式👇

我们将 0x771f 转化为2进制(共16位),并分成 4、6、6 三组,填入👆编码方式的 「x」 的位置,得到 1110 0111 10 011100 10 011111 ,至此完成 「真」 utf-8 编码,转化为 16 进制描述即: 0xe79c9f

那么,有 mac 的小伙伴可以试试我提供的一套基于 iOS 的编码理解工程。可以快速打印出一段文本编码的数据结果( 16 进制、 2 进制都有),示例如下:

git地址: https://github.com/chrisYooh/CYEncoding.git
对你有帮助的话记得帮我点个 「Star」 哦! 😊✨✨✨

python基础之编码问题

python基础之编码问题

本节内容

  1. 字符串编码问题由来
  2. 字符串编码解决方案

1.字符串编码问题由来

由于字符串编码是从ascii--->unicode--->utf-8(utf-16和utf-32等)演变过来的,再加上类似于中国的gbk编码等,这些编码互相之间并不兼容,所以编写的软件实现跨语言平台运行就会出现字符乱码问题。。。

须知内容如下:

  1. 在python2默认编码是ASCII, python3里默认是utf-8(文件编码默认是utf-8,字符串编码默认是unicode)
  2. unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-8就是unicode
  3. 在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

2.字符串编码解决方案

首先,需要明白一点,unicode编码兼容所有编码格式,unicode编码在各种不同编码转换之间充当一个中间桥梁的角色,假如ascii编码要想转换成gbk编码,那就必须先解码,转换成unicode编码,然后再重新编码成gbk编码才算完成了整个过程。从其他编码转换成unicode编码的过程叫做解码(decode),从unicode编码转换成其他编码的过程叫做编码(encode)。PS:utf-8编码默认不兼容gbk编码,需要转换成unicode编码才能兼容gbk编码。

涉及到编码解码方式可以参照如下图所示: 技术分享

编码问题涉及到如下几个方面:

  1. 文件的编码格式
  2. 字符串的编码格式
  3. 输出字符串的终端编码格式

文件的编码格式和字符串的编码格式以及终端的编码格式一致才能正常的输出想要的字符串。

在python中进行转码的有两个函数,是encode()编码函数,以及decode()解码函数。其中encode函数中需要填上该字符串的源编码格式,decode函数中需要填上该字符串需要编码的字符串格式。测试代码如下,原编码格式是utf-8格式字符串:

 1 s="特斯拉"
 2 s_to_unicode=s.decode("utf-8")#解码成unicode编码格式
 3 print(s)
 4 print(s_to_unicode)
 5 unicode_to_gbk=s_to_unicode.encode("gbk")#编码成gbk编码格式
 6 print(unicode_to_gbk)
 7 gbk_to_unicode=unicode_to_gbk.decode("gbk")#解码成unicode编码格式
 8 print(gbk_to_unicode)
 9 unicode_to_utf8=gbk_to_unicode.encode("utf-8")#编码成utf-8编码格式
10 print(unicode_to_utf8)

 

以上是关于编码原理理解之「UTF-8」的主要内容,如果未能解决你的问题,请参考以下文章

unicode,utf-8,ASCLL计算机编码原理

简述区域acsii码,汉字gb编码,unicode码,utf-8码的编码原理和他们之间的联系

JAVA总结之编码

请求与响应的时候乱码问题原理

python之----------字符编码具体原理

音视频处理之编码原理20170905