本文起源于行走在阳光下的那些不可见字符中的知识边界,因为涉及到字符相关,而我也不能很清楚的描述Unicode的前世今生,故而有了此文。 计算机技术的革命极大地方便了人们的工作与生活,使得。..

计算机技术的革命极大地方便了人们的工作与生活,使得人类生活前进了一大步,可是在计算机发展进程中,世界各地由于语言文字不一,有过那么一段混乱难受的日子。..

一、字符集的发展历程

1.1 字符世界的起源

由于计算机在美国诞生,因此字符集最初也只考虑了美国人当时的需求,诞生了大家熟知的ASCII(American Standard Code for Information Interchange),它由26个基本拉丁字母、阿拉伯数字、英式标点符号和一些控制字符组成。
随着世界的发展,各国人民也开始接触计算机,然而各国人民也有自己独特的文化需求,最开始的字符集满足不了人们日益增长的需求,各国出现了不同的字符集标准,比如国内早期的Java程序员熟知的GBK、GB18030等,我曾经实习的时候接触的用JSP的老系统里就有相关的编码设定,如果用错误编码设定了文档解析格式,可能就会看到乱码,再想想世界上那么多个国家,会有多少编码标准啊,这也是互联网早期码比较多的原因吧。
各种编码的字符互不兼容,相互之间的通信可能由于编码的不同,而导致对方看到的是乱码,这就如中国历史中的大秦统一文字和度量单位之前的华夏文明一样,语言不通、货币不通,交流困难。时间的车轮滚滚向前,推动着历史的发展,于是Unicode(Universal Coded Character Set)出现了,它对世界上大部分的文字系统进行了整理、编码,使得计算机能够更简单的方式来呈现和处理字符,它的目的就是为所有的字符提供统一的编码,任何的平台、系统、设备、应用或者语言都能兼容且无风险使用。
至今Unicode仍在不断的增修,当前最新版本为2019年5月公布的12.1,包含137994个字符,不仅包括当今世界上150种语言模型和历史性的手写码和符号,还包括多种符号集与表情符号。

1.2 Unicode

九层之台,起于累土。这样世界性的标准绝不是一蹴而就,必有其坚实的基础,设计原则就是Unicode的一大基础,在《The Unicode Standard Version 6.2 - Core Specification》有提到Unicode的设计原则,
我们熟知的UTF-8其实是Unicode的一种实现方式,即Unicode 转换格式(Unicode Transform Format),是一种为了减少传输数据的大小而设计的变长编码,每个字符使用1/2/3字节按照一定算法进行转换识别。此外,Unicode的实现方式还包括UTF-7、UTF-16、UTF-32、punycode、GB18030等。

总的来说,Unicode于乱世出生逐渐成为标准统一字符世界,至今仍持续发展,造福了社会,极大的提升了生产效率,虽未与ASCII并列与IEEE里程碑,但也是计算机科学史中一件举足轻重的大事记。
本次探索到此结束,全文本着追溯Unicode是什么为什么产生等问题,进行了一系列追寻,大致理清了Unicode的一些”前世今生”,基本对Unicode能够有个大概的认知,需要更加深入的探索的小伙伴可以留言一起探讨~

Unicode的深入理解

二、Unicode编码方式详解

2.1 UTF-8编码

UTF-8是最常用的Unicode编码方式,它的特点:

1
编码规则:
  • 1字节:ASCII字符(0x00-0x7F)
  • 2字节:拉丁字母扩展(0x80-0x7FF)
  • 3字节:大部分常用字符(0x800-0xFFFF)
  • 4字节:辅助平面字符(0x10000-0x10FFFF)
1
优势:
  • 向后兼容ASCII
  • 空间效率高(英文文本只需1字节)
  • 无字节序问题
  • 自同步特性(可以从任意字节开始解析)
1
2
3
示例:
- 'A' (U+0041) → 0x41 (1字节)
- '中' (U+4E2D) → 0xE4 0xB8 0xAD (3字节)

2.2 UTF-16编码

UTF-16使用16位(2字节)或32位(4字节)编码:

  • 基本多文种平面(BMP):直接使用16位编码
  • 辅助平面:使用代理对(Surrogate Pair)编码
1
特点:
  • Windows系统内部使用UTF-16
  • Java、JavaScript等语言使用UTF-16
  • 需要处理字节序(大端/小端)

2.3 UTF-32编码

UTF-32使用32位(4字节)固定长度编码:

  • 每个字符固定4字节
  • 空间效率低
  • 但处理简单,随机访问快

三、Unicode在实际开发中的应用

1. 字符串处理

1
Python示例:
1
2
3
4
5
6
7
8
# Python 3默认使用UTF-8
text = "你好,世界!"
print(len(text)) # 字符数
print(text.encode('utf-8')) # 字节序列
`Java示例:```java
String text = "你好,世界!";
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
String decoded = new String(bytes, StandardCharsets.UTF_8);

2. 文件编码

1
读取文件:

明确指定编码

1
2
with open('file.txt', 'r', encoding='utf-8') as f:
content = f.read()

`写入文件:```python

1
2
with open('file.txt', 'w', encoding='utf-8') as f:
f.write("你好,世界!")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

#### 3. 网络传输

HTTP协议中,Content-Type可以指定字符编码:
`Content-Type: text/html; charset=utf-8`

### 四、常见问题和解决方案

#### 4.1 问题1:乱码问题

原因:
- 编码和解码使用的字符集不一致
- 文件编码与读取编码不匹配

解决方案:
- 统一使用UTF-8编码
- 明确指定编码方式
- 使用BOM标记(不推荐)

#### 4.2 问题2:字符长度计算

问题: 中文字符在不同编码下占用的字节数不同

# Python中区分字符数和字节数
text = "你好"
print(len(text)) # 字符数:2
print(len(text.encode('utf-8'))) # 字节数:6

4.3 问题3:数据库存储

1
MySQL示例:
1
2
3
4
5
6
-- 使用utf8mb4字符集支持完整的Unicode
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);

五、Unicode的发展趋势

5.1 新字符的加入

Unicode标准持续更新,每年都会加入新的字符:

  • 新的语言支持
  • 新的符号和表情
  • 历史文字的数字化

5.2 技术发展

  • 更好的工具支持:IDE、编辑器对Unicode的支持越来越好
  • 性能优化:Unicode处理性能不断提升
  • 标准化:更多标准采用Unicode

六、最佳实践

  1. 统一使用UTF-8:在项目中统一使用UTF-8编码
  2. 明确指定编码:在文件操作、网络传输时明确指定编码
  3. 处理边界情况:注意字符边界、代理对等特殊情况
  4. 测试多语言:在测试中覆盖多语言场景
  5. 文档说明:在文档中明确说明使用的字符编码

七、总结

Unicode的出现解决了字符编码混乱的问题,为全球信息交流提供了统一的标准。作为开发者,理解Unicode的原理和应用,能够帮助我们更好地处理多语言场景,避免编码相关的问题。

随着Unicode标准的持续发展,我们相信它将继续为全球软件开发提供坚实的基础,推动信息技术的进一步发展。

reference:

Unicode Zh

Unicode En

Unicode Charts Index

Unicode Character Database

IEEE里程碑列表
ENIAC

ASCII

Unicode Script

本文标题: Unicode字符集的由来

发布时间: 2025年01月19日 00:00

最后更新: 2025年12月30日 08:54

原始链接: https://haoxiang.eu.org/234f4ab6/

版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

× 喜欢就赞赏一下呗!
打赏二维码