详解 ASCII、Unicode、UTF-32 及 UTF-8

这篇具有很好参考价值的文章主要介绍了详解 ASCII、Unicode、UTF-32 及 UTF-8。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、ASCII 字符集和编码

二、Unicode 字符集

2.1 - UTF-32 编码

2.2 - UTF-8 编码

2.3 - Python 字符串的 encode 和 decode 方法



一、ASCII 字符集和编码

计算机只能存储二进制数字 0 和 1,因此无论是文本中的数字、字母、汉字以及 emoji 都需要以某种方式转换成二进制数字进行存储,需要的时候再读出来。

1963 年,ANSI 推出了 ASCII 作为计算机及其他设备的文本字符编码标准。ASCII 支持的字符包含 0 ~ 9 的阿拉伯数字、大小写英文字母、常用的英文符号(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)以及控制字符(负责对应换行、回车等特殊的控制功能),每个字符都有一个对应的数字,叫作码点,ASCII 的码点为 0 ~ 127 之间的数字,标准所支持的所有字符以及对应码点的集合叫作字符集

  1. ANSI 的全称是 American National Standards Institute,即美国国家标准学会。

  2. ASCII 的全称是 American Standard Code for Information Interchange,即美国信息交换标准代码。

  3. ASCII 字符集(一共包含 128 个字符):详解 ASCII、Unicode、UTF-32 及 UTF-8,C++,Python,c++,python

计算机可以存储 ASCII 码点的二进制,但由于最大的码点是 127,即二进制的长度小于或等于 7,并且计算机一般以 8 比特,即 1 字节,为基本单位读写,所以为了凑整,这些二进制被存储时,会在开头留 0,用固定的 8 比特长度来存储每个字符。

字符 码点 二进制码点 存储在计算机的内容
NUL 0 0 00000000
SOH 1 1 00000001
... ... ... ... ... ... ... ...
0 48 110000 00110000
1 49 110001 00110000
... ... ... ... ... ... ... ...
A 65 1000001 01000001
B 66 1000010 01000010
... ... ... ... ... ... ... ...
~ 126 1111110 01111110
DEL 127 1111111 01111110

这种从字符到计算机能够存储的内容之间的映射叫作编码


二、Unicode 字符集

ASCII 编码一共就适用于 128 个字符,其他语言的字符不够用,于是不同国家和地区开始制定自己的编码标准,比如大陆有国家总局制定的于 1981 年开始实施的 GB2312,港澳台有在 1984 年开始流行的大五码 Big5,后来还有对 GB2312 进行扩展的 GBK,收录了简繁体汉字、日文、韩文等。但是当标准不统一时,乱码问题也随之产生,因为计算机内存里的同一个数字在不同字符集中代表的可能是完全不同的字符

因此大家亟需一种更通用的字符编码,支持不同语言的文字,1991 年 Unicode(统一码、万国码、单一码)字符集发布,目标在于让世界上每个人都能在电脑上阅读自己的文字。随着版本的迭代,Unicode 囊括的字符越来越多,包括汉字、平片假名、藏文、阿拉伯文,甚至古象形文字,2010 年,emoji 也被纳入 Unicode,如今 Unicode 已经包含了超过十四万个字符。Unicode 的每个字符也有对应码点,许多语言都有可以用于查询 Unicode 字符码点的内置函数,例如在 Python 中,可以使用内置函数 ord 获取字符对应的码点(还可以使用内置函数 chr 根据码点获取对应的字符)。

print(ord('A'))  # 65
print(ord('你'))  # 20320

print(chr(65))  # A
print(chr(20320))  # 你

2.1 - UTF-32 编码

注意:字符集只是字符以及字符对应码点的集合,不代表字符一定以对应码点被存储在计算机中,字符编码才是真正定义了字符到计算机存储内容的映射

那么最简单的编码规则自然就是把字符对应的码点直接以二进制存储在计算机中,UTF-32(32-bit Unicode Transformation Format) 编码就是针对 Unicode 这样做的,上面所说的 ASCII 编码也是针对 ASCII 字符集这样做的。

UTF-32 让每个字符都以 32 比特,即 4 字节的长度来存储,位数不够就在前面补 0,32 比特足够表示 Unicode 中的所有字符,固定长度也能帮助计算机明确每个字符的截断范围,但造成的问题是:ASCII 编码中的每个英文字母只要 1 字节,GBK 中的一个汉字只要 2 字节,而在 UTF-32 中则都需要 4 字节。

2.2 - UTF-8 编码

为了改善空间效率,UTF-8(8-bit Unicode Transformation Format)在 1992 年诞生,UTF-8 是针对 Unicode 的可变长度编码,不同于编码后长度固定为 32 比特的 UTF-32,UTF-8 针对不同字符,编码后的长度可以是 32 比特、24 比特、16 比特、8 比特

具体规则是

  1. 码点在 0 ~ 127 范围内的字符直接映射为 1 字节长度的二进制数。

  2. 码点在 128 ~ 2047 范围内的字符映射为 2 字节长度的二进制数。

    UTF-8 为了让计算机知道各个字符之间到底在哪里分割,就让 2 字节编码的第一个字节由 110 开头,第二个字节由 10 开头,Unicode 的二进制码点会被分割成两个部分,填入 UTF-8 编码的数字里

  3. 码点在 2048 ~ 65535 范围内的字符映射为 3 字节长度的二进制数。

    第一个字节由 1110 开头,后面两个字节都由 10 开头,Unicode 的二进制码点会被分割成三个部分,填入 UTF-8 编码的数字中

  4. 码点在 65536 ~ 1114111 范围的字符映射为 4 字节长度的二进制数。

    第一个字节由 11110 开头,后面三个字节都由 10 开头,Unicode 的二进制码点会被分割成四个部分,填入 UTF-8 编码的数字中

码点范围(十进制) 二进制码点 存储在计算机的内容
0 ~ 127 0zzzzzzz 0zzzzzzz
128 ~ 2047 00000yyy yyzzzzzz 110yyyyy 10zzzzzz
2048 ~ 65535 xxxxyyyy yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz
65536 ~ 1114111 000wwwxx xxxxyyyy yyzzzzzz 11110www 10xxxxxx 10yyyyyy 10zzzzzz

此处 w、x、y、z 占位符均表示 0 或 1

UTF-8 的优点

  1. 兼容 ASCII。

  2. 节约空间,UTF-8 让 Unicode 中码点小的字符也相应拥有更短的长度,并且通过前缀信息,也能让计算机辨别各字符在内存中的总长度,解决分割不明的问题。

2.3 - Python 字符串的 encode 和 decode 方法

使用 encode 方法可以将字符串以指定的编码规则转换成对应的编码(注意:不是码点);使用 decode 方法可以将编码按照指定的编码规则解码成字符串文章来源地址https://www.toymoban.com/news/detail-556301.html

# 字符:你
# 码点范围:20320(2048 ~ 65535)
# 二进制码点:01001111 01100000
# 存储在计算机中的内容:11100100 10111101 10100000
# 验证:
print('你'.encode('utf-8'))  # b'\xe4\xbd\xa0' --> 0xe4bda0
print(bin(0xe4bda0))  # 0b11100100 10111101 10100000
print(b'\xe4\xbd\xa0'.decode('utf-8'))  # 你

到了这里,关于详解 ASCII、Unicode、UTF-32 及 UTF-8的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 详解python中的类似‘转ASCII’的ord函数和chr函数

    ord 函数和 chr 函数是Python中用于处理字符和Unicode码点的两个重要函数。 ord(char) 函数: ord 函数接受一个字符作为参数,返回该字符的Unicode码点(整数表示)。 例如, ord(\\\'A\\\') 将返回65,因为大写字母\\\"A\\\"的Unicode码点是65。 chr(unicode) 函数: chr 函数接受一个整数Unicode码点作为参

    2024年02月10日
    浏览(11)
  • 字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)

    字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)

    需要注意字符集和字符编码是不同的。比如当我们提到“数据库使用的是unicode字符集”,这样的说法是错误的,数据库中的数据一定要具体到某一种字符编码,只提到字符集是没有意义的,例如数据库使用UFT-8编码。 字符集:字符和字符码的映射关系,例如在ASCII中a的字符码

    2023年04月18日
    浏览(9)
  • 【Python编程错误:‘utf-8‘编解码器无法解码字节0xd5】--解决方法详解

    【Python编程错误:\\\'utf-8’编解码器无法解码字节0xd5】–解决方法详解 Python是一门非常流行的高级编程语言,用户可以很方便地使用它来实现各种功能。然而,在使用Python编写代码时,有时会遇到各种错误。本文将详细介绍一种常见的Python编程错误——\\\'utf-8’编解码器无法解

    2024年02月08日
    浏览(12)
  • UTF-8、GB2312、GBK、GB18030、ISO-8859-1(也称Latin-1):兼容ASCII编码

    ASCII码是单字节的,首位为0,后面表示的值就是Unicode码点,范围为0x00-0x7F,共表示128个字符。 UTF-8和ASCII兼容 :因为对于单字节的符号,UTF-8 编码和 ASCII 码是相同的, 所以 UTF-8 能兼容 ASCII 编码。 GB2312和ASCII兼容 :对于ASCII范围以内的字符,GB2312编码的机内码(不是区位码)

    2024年02月16日
    浏览(8)
  • 【MySQL】utf8mb4_unicode_ci、utf8mb4_general_ci的区别

    【自我简介】 以下三者都存在于MYSQL数据库的字符集排序规则中; utf8mb4_general_ci : 不区分大小写, utf8mb4_general_cs 区分大小写 utf8mb4_bin : 将字符串每个字符串用二进制数据编译存储,区分大小写,而且可以存二进制的内容。 utf8mb4_unicode_ci : 校对规则仅部分支持Unicode校对规则

    2024年02月12日
    浏览(13)
  • .Net 中实体类转换为XML字符串, 确保字符串头部是utf-8 不是utf-16

    使用 Utf8StringWriter 或类似的方法来确保在序列化过程中使用正确的编码。然而, Utf8StringWriter 不是.NET Core或.NET Standard库的一部分,因此你需要自己实现一个。 不过,有一种更简单的方法可以达到相同的效果,那就是使用 StringWriter 与 Encoding.GetEncoding(\\\"utf-8\\\") 结合,但这实际上

    2024年01月23日
    浏览(14)
  • python 中文字符转换unicode及Unicode 编码转换为中文

    python 中文字符转换unicode及Unicode 编码转换为中文

    废话不多说 直接开干 知识点 decode 字节编码可decode为str encode 将字符串转换为bytes类型的对象 (即b为前缀, bytes类型), 即Ascll编码, 字节数组 encode(‘unicode-escape’)可将此str编码为bytes类型, 内容则是unicode形式 decode(‘unicode-escape’)可将内容为unicode形式的bytes类型转换为str 将一段

    2024年02月04日
    浏览(16)
  • 【MySQL】报错1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL

    记录一次sql语句执行错误: left join表会出现 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_croatian_ci,IMPLICIT) for operation \\\'=\\\'错误. 这是由于表的编码格式不一致 例如 某个表的字符编码为utf8_general_ci而关联表的字符编码为utf8_croatian_ci导致当前错误! 解决方案: 让关联表的字符编

    2024年02月11日
    浏览(10)
  • Python输出所有的Unicode字符!

    Python输出所有的Unicode字符!

    代码一点点,主要就是用了chr函数: 1.因为直接输出太慢,改为文件输出 2. D800~DFFF 是High Surrogate Area和Low Surrogate Area,真打不出来(会报错),因此跳过 输出结果: 虽然 有些 字符不能正常显示,但整体效果不错,像上图这些 CJK扩展区 都能正常显示!

    2024年02月16日
    浏览(12)
  • MySQL - 常用排序规则utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin、utf8mb4_0900_ai_ci和存储字符集 utf8 和 utf8

    MySQL - 常用排序规则utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin、utf8mb4_0900_ai_ci和存储字符集 utf8 和 utf8

    在创建数据库时,我们经常会需要填写数据库名、字符集、排序规则 常用的存储字符集 utf8 和 utf8mb4 排序字符集 utf8mb4_unicode_ci 和 utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci 1、utf8 utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8 字符,也就是 Unicode 中的基本多文本平

    2024年02月09日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包