字符编码:从ASCII到Unicode

字符编码是计算机将字符映射为数字的规则。ASCII用7位编码128个字符,覆盖英文和基本符号,但对中文等语言无能为力。各国发展了各自的编码标准(中文GB2312/GBK、日文Shift-JIS、韩文EUC-KR),导致了"乱码"这一经典问题。Unicode的出现统一了全球所有字符的编码标准,目前收录了超过14万个字符。

Unicode与UTF-8的区别

这是一个常见的混淆点。Unicode是字符集(定义了每个字符的编号,即码点Code Point),UTF-8是编码方式(定义了码点如何存储为字节序列)。类比:Unicode是电话簿(人名→号码),UTF-8是拨号方式(号码→信号)。

UTF-8是变长编码:ASCII字符占1字节(与ASCII完全兼容),中文占3字节,emoji占4字节。这种设计使得英文文本体积最小,同时支持全球所有字符。

前端开发中的编码问题

\uXXXX转义:JavaScript字符串中的\uXXXX语法表示Unicode码点。例如,"\u4e2d\u6587"就是"中文"。这在JSON传输、国际化文件中非常常见。\u后跟4位十六进制数,范围0000-FFFF。超过这个范围的字符需要使用UTF-16代理对(\uD83D\uDE00 = 😀)。

HTML实体编码:&#XXXX;(十进制)或&#xXXXX;(十六进制)语法。例如,中或中都表示"中"。

CSS content中的Unicode:使用\XXXX语法,如content: "\4e2d\6587"。

乱码的根因和解决

乱码的本质是用错误的编码方式解码字节序列。例如,用GBK解码UTF-8编码的中文就会出现乱码。解决方案:确保文件保存、HTTP响应头、HTML meta标签、数据库连接四者使用相同的编码(推荐统一使用UTF-8)。具体检查步骤:确认文件编辑器保存为UTF-8无BOM格式;确认HTTP响应头Content-Type: text/html; charset=utf-8;确认HTML中有;确认数据库连接使用utf8mb4(MySQL)。

Emoji与UTF-16代理对

Emoji的码点超出了BMP(基本多语言平面,U+0000到U+FFFF),需要4字节表示。在JavaScript中(使用UTF-16内部编码),一个Emoji实际上由两个"字符"组成(代理对),length为2。这就是为什么"😀".length === 2。ES6的Array.from()和展开运算符可以正确处理代理对。

工具推荐

使用我们的在线Unicode编码转换工具,支持\uXXXX、十进制、十六进制、CSS等多种格式互转,逐字对照显示,帮助你在开发中快速处理编码问题。