原理解说发布日期 阅读时间约 8 分钟

乱码类型速查表:从縺、ã、‚、ƒ、$B 判断搞错了哪种编码

“縺薙s縺ォ縺。縺ッ”“日本語”“‚±‚ñ‚É‚¿‚Í”这样的日语乱码看似杂乱,其实都是按规则变成这样的。看最先出现的几个字符,基本就能知道把哪种编码错当成了哪种。本文把最常见的 7 种乱码整理成带示例的速查表,并说明各自的成因,以及哪些能恢复、哪些不能。

乱码是“保存时的编码”和“读取时的编码”不一致

电脑里的文字都以数字(字节)序列的形式保存。用哪个数字表示哪个字符的规则就是字符编码,日语常用的有 UTF-8、Shift_JIS、EUC-JP、JIS(ISO-2022-JP)四种。例如平假名“a”,在 UTF-8 中是 E3 81 82 三个字节,在 Shift_JIS 中是 82 A0 两个字节。

乱码发生在用另一种编码的规则读取按某种编码保存的字节的时候。字节本身没有损坏,只是读法错了。因此大多数情况下,用“错读时的编码”把文字变回字节,再用“本来的编码”重新读取,就能还原成原文。

最常见的 7 种乱码速查表

下表是用乱码还原·解读工具实际生成乱码的结果。如果左栏的“标志字符”大量出现,就要怀疑是该行的错读。示例词是日语问候语“konnichiwa”(你好)。

标志字符本来的编码错读时的编码“konnichiwa”的乱码能否恢复
縺、繧、繝、譁、スUTF-8Shift_JIS縺薙s縺ォ縺。縺ッ基本可以(“�”靠推测补全)
ã、æ、å、è、â€UTF-8Latin-1(Windows-1252)ã“ã‚“ã«ã¡ã¯可以
‚、ƒ、Œ、“、•Shift_JISLatin-1(Windows-1252)‚±‚ñ‚É‚¿‚Í可以
、、・、ニ、マEUC-JPShift_JIS、ウ、ヒ、チ、マ基本可以
¤、¥、Ê、ÆEUC-JPLatin-1(Windows-1252)¤³¤ó¤Ë¤Á¤Ï可以
$B…(BJIS(ISO-2022-JP)ESC 符号丢失$B$3$s$K$A$O(B可以
全是“�”Shift_JIS、UTF-8EUC-JP(一串“�”)几乎不能

再看其他词语:日语的“日本語”按 UTF-8→Latin-1 变成“日本語”,按 Shift_JIS→Latin-1 变成““ú–{Œê”;片假名的“测试”一词按 Shift_JIS→Latin-1 变成“ƒeƒXƒg”;“東京都”按 UTF-8→Shift_JIS 变成“譚ア莠ャ驛ス”;日语的“乱码”一词按 EUC-JP→Latin-1 变成“ʸ»ú²½¤±”。

“縺”“繧”“譁”:UTF-8 用 Shift_JIS 打开

这是最常见的乱码。把 UTF-8 保存的 CSV 直接用 Excel 打开,用旧版 Windows 软件或记事本打开,或者把 UTF-8 数据导入以 Shift_JIS 为前提的业务系统时,就会发生。

  • 平假名多的文本满屏“縺”(大部分平假名在 UTF-8 中以 E3 81 或 E3 82 开头,用 Shift_JIS 读取就分别成了“縺”“繧”)
  • 片假名多的文本“繝”很显眼(大部分片假名以 E3 83 开头)
  • 汉字变成“譁”“莨”“螻”等平时见不到的汉字
  • UTF-8 每个字 3 字节,Shift_JIS 按 2 字节划分,分界错位的地方就成了“�”或中点

夹杂“�”是这种乱码的特点,如“譁�ュ怜喧縺�”(日语的“乱码”一词)。“�”处丢失了 1 个原始字节,但根据 UTF-8 的规则可以知道缺了几个字节、缺在哪里,所以工具会推测出构成自然日语的文字来补全。详情请参阅“�”“?”乱码能恢复吗?。

“㔓攓‚”“ƒ”:用面向其他市场的软件打开

全部变成带重音的字母和符号,是因为用西欧编码(Latin-1,准确地说是 Windows-1252)读取了日语。国外的邮件软件和 CMS、数据库编码设置不一致的 WordPress、英文版软件都容易出现这种情况。

  • 以“ã”开头的字符很多→UTF-8 的平假名和片假名(首字节 E3)。“攓唓䔓蔓锓ç”是 UTF-8 的汉字(首字节 E4~E9)
  • “—很显眼→UTF-8 的符号(“…”““”“–”等首字节为 E2 的字符)
  • “‚”很多→Shift_JIS 的平假名(首字节 82)。“ƒ”是片假名(首字节 83)
  • “¤”“¥”很多→EUC-JP 的平假名(首字节 A4)和片假名(首字节 A5)

Latin-1 为 256 种字节中的几乎全部分配了字符,所以原始字节原样保留,这种乱码容易恢复。不过,Windows-1252 中没有分配字符的几个字节(81、8D、8F、90、9D)会变成看不见的控制字符,复制时可能丢失。“ã“ã‚“ã«ã¡ã¯”其实在“ã”和““”之间也有一个看不见的字符。丢失的地方由工具算出位置后补全。

“、”“$B”:旧服务器和邮件的编码

半角的“、”“ウ”“ヒ”等交替排列,是把 EUC-JP 文本用 Shift_JIS 读取的结果。EUC-JP 过去用于 Linux、UNIX 服务器、论坛和旧式 Perl CGI。打开老网站的日志或邮件存档时可能遇到。

像“$BJ8;z2=$1(B”这样被“$B”和“(B”包围的英文数字,是 JIS(ISO-2022-JP)文本丢失了作为切换信号的 ESC(控制字符)。日语邮件曾用这种编码发送,所以把旧邮件迁移到其他软件,或者当作文本复制时就会出现。把“$B”和“(B”之间每 2 个字符一组来读,就能还原。邮件主题的乱码已整理在邮件主题乱码的原因与解决方法中。

知道乱码类型后,如何恢复

  1. 1

    有原始文件的话,重新打开最可靠

    如果只是显示乱码,在编辑器或浏览器中指定编码重新打开就能恢复。在乱码状态下覆盖保存,“�”处的信息就会丢失,无法再恢复,所以要在保存前发现问题。

  2. 2

    手边只有乱码文本的话,粘贴后还原

    只有邮件正文或屏幕复制的内容时,把它粘贴到乱码还原·解读工具。工具会穷举 7 种错读和两次乱码(例如 UTF-8→Shift_JIS 的乱码又被 Latin-1 读取),并把能读成日语的结果排在前面。

  3. 3

    确认推测补全的文字

    从“�”推测补全的文字以黄色显示。文本较短时可能猜错,不符合上下文的文字请点击,换成其他候选。

CSV 用 Excel 打开时的乱码,可以按CSV 用 Excel 打开乱码怎么办的步骤,重新保存成下次不会乱码的形式。“%E3%81%82”“\u3042”这样的字符串并不是乱码,只是编码后的文字被直接显示出来,请参阅%E3、\u3042、\343 的读法。

常见问题

满屏“縺”“繧”的乱码是什么原因?
原因是把 UTF-8 保存的日语当作 Shift_JIS 打开了。UTF-8 的平假名大多以 E3 81 或 E3 82 开头,Shift_JIS 会把它们读成“縺”“繧”。用 UTF-8 重新打开,或把乱码重新按 UTF-8 读取,就能恢复。
一串“㔓—的乱码是什么?
这是把 UTF-8 的日语或符号按 Latin-1(Windows-1252)显示时的乱码。由国外软件或数据库编码设置不一致引起。原始字节几乎原样保留,所以大多能恢复。
所有乱码都能恢复吗?
只要乱码中还保留着原始字节就能恢复。UTF-8→Shift_JIS、UTF-8→Latin-1、Shift_JIS→Latin-1、EUC-JP→Shift_JIS、丢失 ESC 的 JIS 等都可以恢复。而按 EUC-JP 读取后全成了“�”的文本,或替换成“?”后保存的文本,则无法恢复。
在乱码状态下保存了,还能恢复吗?
即使保存成了乱码,只要字符本身还在,反向追溯也可能恢复。但保存时已被替换成“�”或“?”的字符,那些地方的信息已经丢失。

本文介绍的工具

相关文章

原理解说约 8 分钟

邮件主题乱码的原因与解决方法:=?UTF-8?B?、=?ISO-2022-JP?B?、$B 怎么读

收到的日语邮件,主题可能显示成“=?UTF-8?B?5paH5a2X…?=”这样的英文和数字,正文可能变成“$BL@F|$N…(B”。这是用邮件发送日语时约定的写法直接显示了出来。本文说明主题中 =?…?= 的原理、B 方式和 Q 方式的区别、JIS 邮件中的 $B、正文乱码的原因,以及发送方可以采取的对策。

阅读文章 →
原理解说约 8 分钟

%E3%81%82、\u3042、\343 的读法:URL、JSON、Git 中日语变成编码的原因

复制 URL 得到“%E6%96%87%E5%AD%97”,查看 API 返回值看到“\u6587\u5b57”,Git 的文件名显示成“\346\226\207”。这些看起来都像乱码,其实日语并没有损坏,只是把日语的字节或编号用英文数字写了出来,你看到的正是这种“编码”。本文介绍 9 种常见写法的辨认方法和读法、它们出现的场合,以及让显示变回日语的设置。

阅读文章 →