首页 > 其他分享 >快速理解ASCII、GBK、Unicode、UTF-8、ANSI

快速理解ASCII、GBK、Unicode、UTF-8、ANSI

时间:2023-12-29 17:55:46浏览次数:36  
标签:编码 UTF 字节 字符 16 GBK ANSI Unicode

文章大部分内容来源于非官方说明,且无法用逻辑推理出结果,准确性仅供参考。

ASCII

计算机是老外发明的,想让计算机实现更多的功能,必然少不了把常用的字母和符号存进去,甚至包含一些特殊符号,于是ASCII码,American Standard Code for Information Interchange就这样诞生了,它一共256(原先128个,后期又新增到256个)个字符,2^8=256,所以刚好一个字节可以存储的下。

GBK

随着计算机流入中国,ASCII无法满足汉字的需求,于是GBK2312诞生了,但是发现GB2312不够强大,于是GBK诞生了,它包含了 GB2312 字符集中的全部 6763 个汉字,以及其它汉字、拉丁字母、符号和其他特殊字符。因此,总体而言,GBK 编码共包含了21886 个字符,由于2^16>>211886,所以用两个字节存储足够了,这就是一个GBK字符编码的汉字,占2个字节大小的原因,但英文字符仍旧占1个字节。

Unicode

每个国家都搞自己的编码,那么不同国家之间的信息传递就会有乱码的情况,unicode就是为了解决这个问题的,起初是utf-32,蕴含着有容乃大的思想,任何字符都占用4个字节,但是很多人觉得造成了空间浪费,流量传输浪费问题。

UTF-8

为了空间浪费的问题,UTF-8诞生了,utf-8采用的是可变长度,也就是英文字符1个字节(兼容了ASCII),汉字3个字节,表情符号4个字节来表示。这会诞生一个问题,解析软件怎么区分需要解析1-4是几个字节的,那么就制定了一个规范:

  • 占用1个字节的字符:二进制编码以0开头。
  • 占用2个字节的字符:第一个字节以110开头,第二个字节以10开头。
  • 占用3个字节的字符:第一个字节以1110开头,第二个字节以10开头,第三个字节以10开头。
  • 占用4个字节的字符:第一个字节以11110开头,第二个字节以10开头,第三个字节以10开头,第四个字节以10开头。

ANSI

这个在Windows记事本下有这个,ANSI 编码是一种由美国国家标准协会(ANSI)制定的编码标准,主要用于英语和其他西欧语言的编码。实际上,ANSI编码是一个众多编码的集合,它并没有明确的定义,不同程序和系统对其理解和实现也不完全相同。

UTF-16

UTF-16 是一种采用 16 位编码的 Unicode 字符编码方式,它是 Unicode 标准的一部分,可以表示全部的 Unicode 字符集范围(而 UTF-8 和 UTF-7 只能部分表示,所以存在兼容性问题)。
虽然 UTF-16 具有可移植性和编码效率高等优点,但是由于它使用的是 16 位编码,因此会占用更多的存储空间,而且在零散的文本处理和传输过程中,需要更多的字节数。。因为和UTF-32一样因存储问题,而没有成为主流。

UTF-16LE

UTF-16和UTF-16LE都是Unicode字符编码的实现方式,其中的“LE”指的是“Little Endian”,表示低字节顺序,而没有“LE”则默认为高字节序。
UTF-16编码采用16位(两个字节)来表示一个Unicode字符,因此每个字符的存储需要占用两个字节,从而可能导致存储和传输效率低下的问题。UTF-16还支持BOM(Byte Order Mark)来标识字节序列的顺序。
UTF-16LE也是UTF-16的一种变体,它采用Little Endian字节序来存储每个字符的两个字节。这种字节序在Intel和AMD等主流计算机中应用广泛。与UTF-16BE(Big Endian)相比,UTF-16LE在内存存储和网络传输时占用的字节顺序更经济,因此它通常用于Windows及其他操作系统和软件中。

GBK与GB2312

GBK是GB2312的升级版,GBK编码在GB2312的基础上又增加了14240个汉字、生僻字等。按照GB2312的编码方式,两个字节已经不够用了,这时候GBK编码制定了新标准:只要出现一个大于127(0x7F)的字节,那么这个字节和它后面的一个字节共两个字节表示一个汉字,这样做的好处是可以同时兼容ASCII和GB2312。

Big5

Big5,又称为大五码或五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。
中文码分为内码及交换码两类,Big5属中文内码,知名的中文交换码有CCCII、CNS11643。
Big5虽普及于台湾、香港与澳门等繁体中文通行区,但长期以来并非当地的国家/地区标准或官方标准,而只是业界标准。
Big5码是一套双字节字符集,使用了双八码存储方法,以两个字节来安放一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。

MySQL中utf8与utf8mb4

utf8:在早期的 MySQL 版本中,utf8 是用来存储 Unicode 字符的字符集,但它只支持最多三个字节的字符编码范围,无法存储表情符号,因此不是真正的utf-8。
utf8mb4:为了解决 utf8 的不足而引入了 utf8mb4 字符集。utf8mb4 支持最多四个字节的字符编码范围,可以表示更广泛的 Unicode 字符,包括一些特殊表情符号(如 Emoji)等,所以推荐使用

MySQL中utf8mb4_general_ci与utf8mb4_unicode_ci

ci表示不区分大小写。
utf8mb4_general_ci 是一种基于字符串二进制的简单排序规则,它不会考虑字符的语言或文化背景,只会判断字符的字节值大小。比如它认为 ‘a’ 和 ‘A’ 是相等的,认为 ‘ä’ 和 ‘a’ 也是相等的。
utf8mb4_unicode_ci 也支持 Unicode 编码,但排序规则更加智能化,把字符进行了分组,分别考虑了字符的语言、文化背景和排序规则。比如它认为 ‘a’ 与 ‘A’ 不同,认为 ‘ä’ 与 ‘a’ 不同,但它会把类似于 ‘ä’、‘ö’、‘ü’ 这样的字符分到一组,并认为它们相等。
综上所述,如果需要对字符的语言、文化背景和排序规则进行精确的排序和比较,建议使用 utf8mb4_unicode_ci。

latin-1、latin-2

用于表示拉丁字母字符和其他特殊字符。它最初是为了表示欧洲语言而设计的,但后来也被广泛用于其他地区和语言。
其中,最常见的 Latin 编码标准有 Latin-1(ISO-8859-1)和 Latin-2(ISO-8859-2)。
Latin-1 编码涵盖了西欧语言(如英语、法语、德语、西班牙语等)中的基本拉丁字母字符以及一些特殊字符和符号。
Latin-2 编码扩展了 Latin-1,覆盖了中欧语言(如捷克语、波兰语、匈牙利语等)中的字符。

BOM

BOM(Byte Order Mark)是一个特殊的字符序列,用于表示文本数据的字节顺序(即大端序或小端序)。它通常作为文本文件的开头几个字节出现。
BOM 在处理文本文件时具有重要作用,它可以帮助确定文本数据的正确编码方式,从而正确解析和显示文本内容。

标签:编码,UTF,字节,字符,16,GBK,ANSI,Unicode
From: https://www.cnblogs.com/phpphp/p/17935446.html

相关文章

  • 内置组件-Transition
    介绍<Transition>是一个内置组件,这意味着它在任意别的组件中都可以被使用,无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发:由v-if所触发的切换由v-show所触发的切换由特殊元素切换的动态组件改变特殊......
  • 内置组件-TransitionGroup
    介绍<TransitionGroup>是一个内置组件,用于对v-for列表中的元素或组件的插入、移除和顺序改变添加动画效果。和<Transition>的区别​<TransitionGroup>支持和<Transition>基本相同的props、CSS过渡class和JavaScript钩子监听器,但有以下几点区别:默认情况下,它不......
  • 磁盘调度算法、虚拟内存、抖动(颠簸)、堆栈访问速度、内存分配、内存交换、编码(ASCII、U
    常见的几种磁盘调度算法:读写一个磁盘块的时间的影响因素有:......
  • ansible设置用户密码
    用ansible设置用户的密码时,由于需要对传输的密码进行加密,#!/usr/bin/python3importcryptimportsys#接收要加密的密码password=sys.argv[1]#生成saltsalt=crypt.mksalt(crypt.METHOD_SHA512)#加密密码crypt_password=crypt.crypt(password,salt)#打印加密后......
  • 依赖注入容器 perRequest(Transient)和Singleton区别
    在CM框架中,"perRequest"和"Singleton"都是生命周期配置选项,用于指示对象的创建和共享方式。它们之间的区别在于对象实例的生命周期和共享方式。对于"perRequest"(有时被称为"Transient"):对象的实例在每个请求处理期间只创建一次,并在同一个请求内共享。每个请求都有自己的对象实例,不......
  • Thunderbolt 3 PCIe Expansion 扩展卡
    计算机目前大部分都能够提供Thunderbolt3接口了。Thunderbolt3的传输速度更快,所以我们需要把Thunderbolt3转换为SASHBA,但市场上没有这个转换设备。后来我们发现有Thunderbolt3PCIeExpansion,就是通过这个设备把Thunderbolt3转换为PCIe卡槽,然后再插上SASHBA卡,......
  • cmd 中文乱码 VS Studio utf-8 中文乱码
      2、永久修改win键+R,输入regedit,确定。打开注册表编辑器按顺序找到HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\CommandProcessor。点击右键-新建,选择“字符串值”。命名为“autorun”,点击右击修改,数值数据填写“chcp65001”,确定。这时候打开cmd命令窗口就会看到,和之......
  • ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证
    ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证背景周末分析了SQLServermysql等数据库想着继续分析一下oracle数据库这边oracle使用的是ZHS16GBK的字符集.所以比较特殊.还是建议得使用UTF-8字符集.能让系统干的活就让系统干,自己干国际化太费劲了.处......
  • win10 dos命令窗口输出中文乱码(将黑窗口改成UTF-8编码)
    1.情景展示在开发过程中,我们通常使用UTF-8编码。然鹅,操作系统默认字符集是GBK,这导致在黑窗口下出现的中文,以乱码的形式展现。如何解决?2.具体分析如何查看命令窗口的字符集?方式一win+r-->输入:cmd,打开黑窗口。运行:chcp,按回车键,可以得到:936,936对应的就是简体中文,也是windo......
  • 讲解'utf-8' codec can't decode byte 0xb6 in position 34: invalid start byte
    讲解'utf-8'codeccan'tdecodebyte0xb6inposition34:invalidstartbyte在编程过程中,我们经常会遇到各种编码和解码的问题。其中一个常见的错误是'utf-8'codeccan'tdecodebyte0xb6inposition34:invalidstartbyte。这个错误表示在使用utf-8编码解码时,无法解......