乱码的根源:把数字当字符,把字符又当数字

从网页上复制一段代码,  还写着  ;用记事本打开配置文件,标题成了 ???;文件名里带个空格,命令行把一条命令拆成了三条。这三类事故同源:文本从来不是裸的,它总是以某种格式存在——编码格式、传输格式、解析格式。大部分问题出在"用错格式去读"。 把编码、Base 家族、实体、转义四条线分清,就不再靠玄学试错。所有例子都可以自己验算,所有工具都在浏览器本地跑,敏感的配置和接口数据不会离开本机。

字符归根到底是数字

第一性原理:A 是 65。ASCII 码表里大写 A 为 65、小写 a 为 97、空格 32,小写减大写恒等于 32,心算差值靠一张 ASCII码表 就够;ASCII编码转换 做文本与码点的双向互转,顺带展示全表。再看二进制:hi 经 二进制转换 得到 01101000 01101001——h 是 104,转成 8 位二进制正是 01101000,可以手算复核。

多字节时代记两个数就够用:中 在 UTF-8 里占 3 字节(E4 B8 AD),中文 占 6 字节。乱码的本质是写入时的编码和读取时的编码不一致:GBK 存的 CSV 按 UTF-8 读,汉字自然成了乱码。修法不是逐个试编码,用文件编码批量转换器把一批文件先检测(UTF-8/GBK/Big5)再统一转成 UTF-8,检测与转换全在本地浏览器完成,文件不上传。

Base 家族:不止 Base64,还有 Base32、Base58、Base62

Base 系列的本质是"换表数数":把字节流切成 6 位一组,按字母表编号。手算一遍 Man → TWFu:M、a、n 是 77、97、110,拼成 24 位后切成 010011、010110、000101、101110,对应字母表下标 19、22、5、46,即 T、W、F、u。每 3 字节变 4 字符,所以 Base64 让体积膨胀约三分之一——把图片嵌进页面时先算好账:用文件Base64转换器生成 data:image/png;base64,… 的 Data URI,一张 100KB 的图会让 CSS/HTML 里多出约 133KB。

家族里不只有 Base64。多编码转换工具支持 Base32、Base58、Base62 等格式互转:双因子认证里的密钥常用 Base32,字母表只有大写 A–Z 和数字 2–7,粘进 URL、邮件都不出事;Base58 是比特币地址的选择,刻意剔掉 0、O、I、l 这些肉眼难辨的字符。看懂表就明白:这些都不是加密,只是换了一本数字的书写系统。

转义:你在给哪一层喂数据

同一句话送到不同地方,要化的"妆"完全不同。三条线各有各的工具,一条都别串:

HTML/XML 实体线。 从博客复制代码,满屏 &lt;div&gt; 和 &amp;,粘进 HTML解码 一键还原成真字符。反向写 XML 时更严格:正文里一个孤立的 & 直接让解析失败,所以 & < > " ' 五个特殊字符必须转义成 &amp; &lt; &gt; &quot; &apos;,XML转义 负责转义与反转义的双向操作,防止配置文件莫名报错。

URL 百分号线。 查询参数只允许"安全字符集",其余全部变成 %十六进制。{"id":1,"q":"hello world"} 丢进 JSON URL编码 得到 %7B%22id%22%3A1%2C%22q%22%3A%22hello%20world%22%7D:{ 变 %7B,空格变 %20。不转义的坑很具体:JSON 里的 & 不被转义会被当成参数分隔符,你的参数当场断成两截。

Shell 引号线。 rm $(ls) 删的不是名为 $(ls) 的文件——bash 先执行了括号。Bash命令转义把带空格、单引号、$、反引号的文件名和参数安全化成"纯文本"。一条口诀记终身:单引号里全是字面量,双引号里 $、反引号、\ 仍然生效。 用户输入不转义就拼进命令,就是命令注入——安全漏洞榜上的常青树。

前端上传还有第四条线:FormData 转换工具在 JSON 与 FormData 之间互转,multipart 请求体和 boundary 长什么样一眼可见,接口调试不用再手写分隔符。

顺带两件:Unicode 转义和颜色值

后端接口把中文转义成 \u4E2D 很常见,emoji 更特殊:😀(U+1F600)在 UTF-16 里是一对代理 \uD83D\uDE00。粘进 Unicode编码转换 来回还原,中文和 emoji 都不会再变问号。颜色同理:设计稿给 #FF8800,手算 RGB 是 (255, 136, 0);最大 255、最小 0,亮度 50%,红色最高、绿色居中,色相 = 60 × 136 ÷ 255 ≈ 32°,即 hsl(32, 100%, 50%)。颜色编码转换把 HEX、RGB、HSL、HSV 四家格式互转,设计侧和代码侧终于同一套数值。

常见问题

URL 编码和 HTML 转义什么区别?

目的地不同、格式不同:URL 用 % 加十六进制(空格是 %20),HTML 用 &实体;(& 是 &amp;)。两者不能互换着用:%20 被 HTML 原样显示时是字面文本,&amp; 没转义进 URL 参数则会把后半截吞掉。先问"这段文本要给谁解析",再选工具。

Base64 是不是加密?

不是。Base64 是公开表格的编码,没有密钥,人人可逆。它的作用是让二进制安全穿过只认文本的通道——邮件、URL、JSON。要保密就得上真加密,多套一层 Base 只是自欺。

文件打开乱码,是不是文件坏了?

大概率没坏,字节还在,只是读取编码不对。用批量转换器先检测真实编码,再统一转 UTF-8,比在记事本的十几项编码里碰运气可靠得多。

小结

编码问题分三层:乱码 = 字节用错表去读(ASCII 65/97/32 的账,UTF-8 的 3 字节中文,检测交给批量转换器);Base = 换表数数(3 字节变 4 字符、膨胀三分之一,Base32/58/62 只是字母表不同);转义 = 给特定场合化妆(HTML 实体、URL 百分号、Shell 引号,各自成体系,互相冒充就出事故)。本文用到的 ASCII码表、ASCII编码转换、二进制转换、多编码转换工具、HTML解码、XML转义、JSON URL编码、Bash命令转义、FormData转换工具、颜色编码转换等工具全部浏览器本地运行,代码片段、配置文件、接口样例都是敏感内容,不该离开自己的电脑。更多排序、去重、繁简转换见《文本处理工具箱:从正则到繁简转换的 30 款》。