字符编码初识
零碎知识 计组原理 0 216

字符编码是计算机科学中的重要概念,它定义了如何将字符转换为二进制数据以在计算机系统中进行存储和传输。本文简要介绍下几个常见的相关名词,包括ASCII、ISO-8859-1、Unicode、UTF-8、UTF-16、GB2312、GBK。

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最早的字符编码标准之一,它定义了标准的字符集和字符与二进制数据之间的对应关系。ASCII编码使用7位来表示字符,共计可以表示128个字符,包括字母、数字、标点符号等。然而,ASCII编码仅适用于英语及其周边语言,并不能满足全球范围内各种语言文字的需求。

ISO-8859-1(Latin-1)是扩展了ASCII,它在标准的ASCII字符集基础上增加了西欧语言的特殊字符。ISO-8859-1使用8位来编码,范围从0x00到0xFF,其中0x00至0x7F对应原始ASCII字符集,0x80至0xFF则为扩展字符集。

Unicode是一个更加全面和统一的字符编码方案,它致力于为世界上所有语言的每个字符提供一个唯一的标识数值。这些数值称为Unicode码点(code point)。每个字符都有一个唯一的Unicode码点,这个码点通常以十六进制表示(0~0x10ffff),最重要的部分(0~0xFFFF)又叫基本多文种平面(Basic Multilingual Plane, BMP)。例如,拉丁字母"A"的Unicode码点是U+0041,汉字"中"的Unicode码点是U+4E2D。Unicode编码集定义了数以千计的字符,包括世界上几乎所有的书写系统中的字符,以及许多符号和特殊字符。

UTF-8是Unicode的一种变长字符编码方案(1~4字节)。它用一个字节表示ASCII字符;使用多个字节表示其他字符【中文用三个字节】。

  • 优点:
    • 兼容性: 与ASCII兼容的,这意味着对于英文和其他使用ASCII字符集的语言,UTF-8编码的文本与ASCII编码的文本是完全相同的。
    • 节省空间: 对于大部分欧洲语言和其他较为常见的语言,使用UTF-8占用空间小。
    • 广泛支持: UTF-8在互联网上得到广泛支持,大多数网络协议和文件格式都默认使用 UTF-8编码。
    • 易于处理: UTF-8 编码方案使得文本处理变得相对简单,因为它使用了单字节的 ASCII 字符以及一些简单的多字节序列,这使得文本搜索、截取等操作相对容易。
  • 缺点:
    • 随机访问困难: 由于UTF-8是变长编码,对于需要随机访问字符串的应用,例如在某些类型的数据库中,UTF-8的性能不如定长编码。

UTF-16同样是Unicode的一种字符编码方案,对应BMP内的字符通常使用2个字节表示,而对非BMP的字符(例如辅助字符、表情符号等)使用4个字节表示。

  • 优点:
    • 随机访问高效: 使用定长编码有助于高效访问随机访问字符,适合用在数据库系统等场景中。
  • 缺点:
    • 不兼容ASCII: 对于只包含ASCII字符的文本,UTF-16编码会浪费一些空间,还会有转换上的麻烦。
    • 字节序问题: UTF-16存在字节序问题,即大端序和小端序之分,这可能导致跨平台兼容性问题。【小端序是低地址存低字节部分】

常见的中文字符编码有GB2312和GBK。其中,GBK是GB2312的扩展,使用2个字节表示每个字符,能够覆盖大部分中文汉字和一些特殊字符。虽然UTF-8被广泛认为是在国际化环境下的首选编码,但由于历史原因、特定场景下的性能问题(如嵌入式设备)和特定领域的需求(如传统印刷出版业),GBK仍然有其存在的合理性和优势。

编写
预览