编码方式是什么

2023-07-31 10:04:00 生活常识 投稿:七秒鱼.

编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式。视频流传输中最为重要的编解码标准有国际电联的H.261、H.263,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准。

所谓编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式。视频流传输中最为重要的编解码标准有国际电联的 H.261、H.263,运动静止图像专家组的 M-JPEG 和国际标准化组织运动图像专家组的 MPEG 系列标准,此外在互联网上被广泛应用的还有 Real-Networks 的 RealVideo、微软公司的 WMT 以及 Apple 公司的 QuickTime 等。

编码方式是什么

音视频编码

音频数字化主要有压缩与非压缩两种方式。较早出现的数字音频播放机,如 CD 唱机和 DAT 录音机,均采用线性 PCM 编码来存储音乐信号,为非压缩方式。在高质量要求的音频工作站和数字录像机(如 DVCPRO)上,也采用非压缩的格式。

我们常见的 MPEG、Dolby Digital、DTS 等则为压缩方式。压缩分为有损压缩和无损压缩。有损压缩的目的是提高压缩率,降低占用系统资源。可以根据实际需要选用不同的采样速率、样本分辨率(精度)和数据率。

数字卫星广播系统的信源编码技术采用 MPEG-2.5 第三层声音编码算法。第三层编码算法最复杂、延时最大、效率最高。因此对一定的数据速率,第三层协议得到的音质最好。当然,用户可根据需要选择 8—128Kbps 范围的不同速率。声音质量可达到 CD 音质。

非压缩编码(PCM)

声音之所以能够数字化,是因为人耳所能听到的声音频率不是无限宽的,主要在 20kHz 以上。按照抽样定理,只有抽样频率大于 40kHz,才能无失真地重建原始声音。如 CD 采用 44.1kHz 的抽样频率,其他则主要采用 48kHz 或 96kHz。

PCM(脉冲编码调制)是一种将模拟语音信号变换为数字信号的编码方式。主要经过 3 个过程:抽样、量化和编码。抽样过程将连续时间模拟信号变为离散时间、连续幅度的抽样信号,量化过程将抽样信号变为离散时间、离散幅度的数字信号,编码过程将量化后的信号编码成为一个二进制码组输出。

压缩编码

PCM 虽然为无损压缩,但由典型的音频信号表示的信号特性没有达到最佳,也没有很好的适应人耳听觉系统的特定要求。PCM 的数据量过高,从而造成存储和传输方面的障碍,因此必须使用相应的技术降低数字信号源的数据率,又尽可能不对节目造成损伤,这就是压缩技术。

字符集编码

搞清常用编码特性是解决字符集编码问题的基础。字符集编码的识别与转换、分析各种乱码产生的原因、编程操作各种编码字符串(例如字符数计算、截断处理)等都需要弄清楚编码的特性。

了解一种字符集编码主要是要了解该编码的编码范围,编码对应的字符集(都包含哪些字符),和其他字符集编码之间的关系等。

ASCII

ASCII 码是 7 位编码,编码范围是 0x00-0x7F。ASCII 字符集包括英文字母、阿拉伯数字和标点符号等字符。其中 0x00-0x1F 和 0x7F 共 33 个控制字符。

只支持 ASCII 码的系统会忽略每个字节的最高位,只认为低 7 位是有效位。HZ 字符编码就是早期为了在只支持 7 位 ASCII 系统中传输中文而设计的编码。早期很多邮件系统也只支持 ASCII 编码,为了传输中文邮件必须使用 BASE64 或者其他编码方式。

GB2312

GB2312 是基于区位码设计的,区位码把编码表分为 94 个区,每个区对应 94 个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般 用 10 进制数来表示,如 1601 就表示 16 区 1 位,对应的字符是“啊”。在区位码的区号和位号上分别加上 0xA0 就得到了 GB2312 编码。

区位码中 01-09 区是符号、数字区,16-87 区是汉字区,10-15 和 88-94 是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字 计 3755 个,置于 16-55 区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计 3008 个,置于 56-87 区,按部首/笔画顺序排列。一级汉 字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。

GB2312 字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以用繁体汉字测试某些系统是不是只支持 GB2312 编码。

GB2312 的编码范围是 0xA1A1-0xFEFE,去掉未定义的区域之后可以理解为实际编码范围是 0xA1A1-0xF7FE。

EUC-CN 可以理解为 GB2312 的别名,和 GB2312 完全相同。

区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而 GB2312 及 EUC-CN 是实际计算机环境中支持这 种字符集的编码。HZ 和 ISO-2022-CN 是对应区位码字符集的另外两种编码,都是用 7 位编码空间来支持汉字。区位码和 GB2312 编码的关系有点像 Unicode 和 UTF-8。

GBK

GBK 编码是 GB2312 编码的超集,向下完全兼容 GB2312,同时 GBK 收录了 Unicode 基本多文种平面中的所有 CJK 汉字。同 GB2312 一样,GBK 也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK 还收录了 GB2312 不包含的 汉字部首符号、竖排标点符号等字符。

GBK 的整体编码范围是为 0x8140-0xFEFE,不包括低字节是 0×7F 的组合。高字节范围是 0×81-0xFE,低字节范围是 0x40-7E 和 0x80-0xFE。

低字节是 0x40-0x7E 的 GBK 字符有一定特殊性,因为这些字符占用了 ASCII 码的位置,这样会给一些系统带来麻烦。

有些系统中用 0x40-0x7E 中的字符(如“|”)做特殊符号,在定位这些符号时又没有判断这些符号是不是属于某个 GBK 字符的低字节,这样就会造成错误判断。在支持 GB2312 的环境下就不存在这个问题。需要注意的是支持 GBK 的环境中小于 0x80 的某个字节未必就 是 ASCII 符号;另外就是最好选用小于 0×40 的 ASCII 符号做一些特殊符号,这样就可以快速定位,且不用担心是某个汉字的另一半。Big5 编码中也存在相应问题。

CP936 和 GBK 的有些许差别,绝大多数情况下可以把 CP936 当作 GBK 的别名。

GB18030

GB18030 编码向下兼容 GBK 和 GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。GB18030 收录了所有 Unicode3.1 中的字符,包括中国少数民族字符,GBK 不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。

GBK 和 GB2312 都是双字节等宽编码,如果算上和 ASCII 兼容所支持的单字节,也可以理解为是单字节和双字节混合的变长编码。GB18030 编码是变长编码,有单字节、双字节和四字节三种方式。

GB18030 的单字节编码范围是 0x00-0x7F,完全等同与 ASCII;双字节编码的范围和 GBK 相同,高字节是 0x81-0xFE,低字节 的编码范围是 0x40-0x7E 和 0x80-FE;四字节编码中第一、三字节的编码范围是 0x81-0xFE,二、四字节是 0x30-0x39。

Windows 中 CP936 代码页使用 0x80 来表示欧元符号,而在 GB18030 编码中没有使用 0x80 编码位,用其他位置来表示欧元符号。这可以理解为是 GB18030 向下兼容性上的一点小问题;也可以理解为 0x80 是 CP936 对 GBK 的扩展,而 GB18030 只是和 GBK 兼容良好。

BIG5

Big5 是双字节编码,高字节编码范围是 0x81-0xFE,低字节编码范围是 0x40-0x7E 和 0xA1-0xFE。和 GBK 相比,少了低字节是 0x80-0xA0 的组合。0x8140-0xA0FE 是保留区域,用于用户造字区。

Big5 收录的汉字只包括繁体汉字,不包括简体汉字,一些生僻的汉字也没有收录。GBK 收录的日文假名字符、俄文字符 Big5 也没有收录。因为 Big5 当中收录的字符有限,因此有很多在 Big5 基础上扩展的编码,如倚天中文系统。Windows 系统上使用的代码页 CP950 也可以理解为是对 Big5 的扩展,在 Big5 的基础上增加了 7 个汉字和一些符号。Big5 编码对应的字符集是 GBK 字符集的子集,也就是说 Big5 收录的字符是 GBK 收录字符的一部分,但相同字符的编码不同。

因为 Big5 也占用了 ASCII 的编码空间(低字节所使用的 0x40-0x7E),所以 Big5 编码在一些环境下存在和 GBK 编码相同的问题,即低字节范围为 0x40-0x7E 的字符有可能会被误处理,尤其是低字节是 0x5C(”/”)和 0x7C(”|”)的字符。可以参考 GBK 一节相应说明。

尽管有些区别,大多数情况下可以把 CP950 当作 Big5 的别名。

ISO-8859-1

ISO-8859-1 编码是单字节编码,向下兼容 ASCII,其编码范围是 0x00-0xFF,0x00-0x7F 之间完全和 ASCII 一致,0x80-0x9F 之间是控制字符,0xA0-0xFF 之间是文字符号。

ISO-8859-1 收录的字符除 ASCII 收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在 ISO-8859-1 当中。

因为 ISO-8859-1 编码范围使用了单字节内的所有空间,在支持 ISO-8859-1 的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作 ISO-8859-1 编码看待都没有问题。这是个很重要的特性,MySQL 数据库默认编码是 Latin1 就是利用了这个特性。ASCII 编码是一个 7 位的容器,ISO-8859-1 编码是一个 8 位的容器。

Latin1 是 ISO-8859-1 的别名,有些环境下写作 Latin-1。

UCS-2 和 UTF-16

Unicode 组织和 ISO 组织都试图定义一个超大字符集,目的是要涵盖所有语言使用的字符以及其他学科使用的一些特殊符号,这个字符集就是通用字符集(UCS,Universal Character Set)。这两个组织经过协调,虽然在各自发展,但定义的字符位置是完全一致的。ISO 相应的标准是 ISO 10646。Unicode 和 ISO 10646 都在不断的发展过程中,所以会有不同的版本号来标明不同的发展阶段,每个 Unicode 版本号都能找到相对应的 ISO 10646 版本号。

ISO 10646 标准定义了一个 31 位的字符集。前两个字节的位置(0x0000-0xFFFD)被称为基本多语言面(Basic Multilingual Plane, BMP) ,超出两个字节的范围称作辅助语言面。BMP 基本包括了所有语言中绝大多数字符,所以只要支持 BMP 就可以支持绝大多数场合下的应用。Unicode 3.0 对应的字符集在 BMP 范围内。

UCS 字符集为每个字符分配了一个位置,通常用“U”再加上某个字符在 UCS 中位置的 16 进制数作为这个字符的 UCS 表示,例如“U+0041”表示字符“A”。UCS 字符 U+0000 到 U+00FF 与 ISO-8859-1 完全一致。

UCS-2、UTF-16 是 UCS 字符集(或者说是 Unicode 字符集)实际应用中的具体编码方式。UCS-2 是两个字节的等宽编码,因为只是使用了两个字节的编码空间,所以只能对 BMP 中的字符做编码。UTF-16 是变长编码,用两个字节对 BMP 内的字符编码,用 4 个字节对超出 BMP 范围的辅助平面内的字符作编码。

UCS-2 不同于 GBK 和 Big5,它是真正的等宽编码,每个字符都使用两个字节,这个特性在字符串截断和字符数计算时非常方便。

UTF-16 是 UCS-2 的超集,UTF-16 编码的两字节编码方式完全和 UCS-2 相同,也就是说在 BMP 的框架内 UCS-2 完全等同与 UTF-16。实际情况当中常常把 UCS-16 当作 UCS-2 的别名。

UCS-2 和 UTF-16 在存储和传输时会使用两种不同的字节序,分别是 big endian 和 little endian(大尾和小尾)。例如“啊”(U+554A)用 big endian 表示就是 0x554A,用 little endian 表示就是 0x4A55。UCS-2 和 UTF-16 默认的字节序是 big endian 方式。在传输过程中为了说明字节序需要在字节流前加上 BOM(Byte order Mark),0xFEFF 表示是 big endian,0xFFFE 表示是 little endian。UCS-2BE、UCS-2LE 是实际应用中使用的编码名称,对应着 big endian 和 little endian,UTF-16BE、UTF-16LE 也是如此。因为默认是 BE 字节序,所以可以把 UCS-2 当做是 UCS-2BE 的别名。

在 UCS 编码中有一个叫做“ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是 U+FEFF,是个没有实际意义的字符。UCS 规范建议我们在传输字节流前,先传输字符“ZERO WIDTH NO-BREAK SPACE”,如果传输的 ZERO WIDTH NO-BREAK SPACE 是 0xFEFF 就说明是 big endian,反之就是 little endian。

UCS-2 和 UTF-16 也可以理解为和 ASCII 以及 ISO-8859-1 兼容,在 ASCII 编码或者 ISO-8859-1 编码的每个字节前加上 0x00,就得到相应字符的 UCS-2 编码。

UCS-2 和 UTF-16 中会使用 0x00 作为某个字符编码的一部分,某些系统会把 0x00 当作字符串结束的标志,在处理 UCS-2 或 UTF-16 编码时会出现问题。

UTF-8

UTF-8 是 UCS 字符集的另一种编码方式,UTF-16 的每个单元是两个字节(16 位),而 UTF-8 的每个单元是一个字节(8 位)。UTF-16 中用一个或两个双字节表示一个字符,UTF-8 中用一个或几个单字节表示一个字符。

可以认为 UTF-8 编码是根据一定规律从 UCS-2 转换得到的,从 UCS-2 到 UTF-8 之间有以下转换关系:

UCS-2 UTF-8

U+0000 – U+007F 0xxxxxxx

U+0080 – U+07FF 110xxxxx 10xxxxxx

U+0800 – U+FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“啊”字的 UCS-2 编码是 0x554A,对应的二进制是 0101 0101 0100 1010,转成 UTF-8 编码之后的二进制是 1110 0101 10 010101 10 001010,对应的十六进制是 0xE5958A。

UCS-4 也是一种 UCS 字符集的编码方式,是使用 4 个字节的等宽编码,可以用 UCS-4 来表示 BMP 之外的辅助面字符。UCS-2 中每两个字节前再加上 0x0000 就得到了 BMP 字符的 UCS-4 编码。从 UCS-4 到 UTF-8 也存在转换关系,根据这种转换关系,UTF-8 最多可以使用六个字节来编码 UCS-4。

根据 UTF-8 的生成规律和 UCS 字符集的特性,可以看到 UTF-8 具有的特性:

UTF-8 完全和 ASCII 兼容,也就是说 ASCII 对应的字符在 UTF-8 中和 ASCII 编码完全一致。范围在 0x00-0x7F 之内的字符一定是 ASCII 字符,不可能是其他字符的一部分。GBK 和 Big5 都存在的缺陷在 UTF-8 中是不存在的。

大于 U+007F 的 UCS 字符,在 UTF-8 编码中至少是两个字节。

UTF-8 中的每个字符编码的首字节总在 0x00-0xFD 之间(不考虑 UCS-4 支持的情况,首字节在 0x00-0xEF 之间)。根据首字节就可以判断之后连续几个字节。

非首字节的其他字节都在 0x80-0xBF 之间;0xFE 和 0xFF 在 UTF-8 中没有被用到。

GBK 编码中的汉字字符都在 UCS-2 中的范围都在 U+0800 – U+FFFF 之间,所以每个 GBK 编码中的汉字字符的 UTF-8 编码都是 3 个字节。但 GBK 中包含的其他字符的 UTF-8 编码就不一定是 3 个字节了,如 GBK 中的俄文字符。

在 UTF-8 的编码的传输过程中即使丢掉一个字节,根据编码规律也很容易定位丢掉的位置,不会影响到其他字符。在其他双字节编码中,一旦损失一个字节,就会影响到此字节之后的所有字符。从这点可以看出 UTF-8 编码非常适合作为传输编码。

标签: # 方式
声明:犀牛文库所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系admin@qq.com