说起「乱码」,没遇到过的电脑用户可能是极少的,尤其在国内中文环境下。暴露年龄的「烫烫烫」系列乱码已经绝迹,现如今遇到的往往是类似「%E9%AB%98%E9%A2%91」和「自在飞花轻似梦」的字符串。本文就这两种乱码情况分别给出解决方法。

首先应该说明的是,本文所说的方法是在出现文件名乱码情况下,如何恢复文件名的正确中文名称,并非一劳永逸地避免乱码的出现。这是由于下载文件名称乱码的出现,往往是系统、浏览器、网站三方面因素共同影响导致的,错综复杂。想要避免乱码的出现,只能根据具体的情况,对个人的系统或浏览器做出针对特定网站的调整配置。

%E9类型乱码

这种情况往往是由于网站和浏览器之间存在兼容性问题导致的,我在 macOS 英文系统上使用 Firefox 下载网盘中的文件时就遇到过,这些形如「%E9%AB%98%E9%A2%91」的字符串实际上是文件名的 URL 编码。下面介绍各系统平台上的解决方法。

macOS 系统

macOS系统自带强大的自动化支持,如 Automator 和 AppleScript。这里,我使用 Automator 编写了一个文件服务,使用方法:

首先,下载「♲ 文件名 UrlDecode.workflow.zip」,解压后双击安装。

null

然后,右键单击需要处理的文件,选择服务子菜单中的 ♲ 文件名 UrlDecode,完毕。

使用演示
使用演示

这个服务不需要网络,支持批量处理多个文件或文件夹。用 Automator 打开会发现其原理很简单,只有「运行 Shell 脚本」的操作,其中的 Shell 代码为:

# 调用 Python 内置模块进行解码
alias urldecode='python -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"'

# 遍历选择的文件列表,进行重命名
for f in "$@"
do
    newName=$(urldecode "$f")
    mv "$f" "$newName"
done

Windows 系统

相比 macOS, Windows 缺乏友好、易用的自动化工具。在安装 Python 后,可以利用批处理命令调用代码python -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"进行文件名修复。但是考虑到该过程略复杂,该类乱码出现频率较低,所以这里不提供工具,而是介绍如何利用在线网站解决问题。

  1. 复制文件的乱码名称,如「%E9%AB%98%E9%A2%91」。
  2. 打开在线解码网站。粘贴到输入框,点击下方的「UrlDecode 解码」,即可得到对应中文。
  3. 复制解码后的中文,重命名文件。

Linux 系统

Linux 各发行版和桌面环境的差异较大,且用户折腾能力较强,这里就不给出具体工具了。可根据自己的实际情况,利用上方的 Shell 代码尝试解决。

iOS 与 Android 系统

手机系统上同样难以做到 macOS 上的「一键修复」,推荐使用上文中 Windows 系统小节的在线网站解决。


自å 类型乱码

这种乱码的形成过程基本相似,但其中涉及的编码却各有不同,错综复杂。考虑到国内电脑用户遇到的情况,多出现于从国内的政府、院校、企业等网站下载文件时,一般属于同一种类型,即 GBK 编码解码错误。下面将针对此种类型给出解决方法。

首先,我以经常出现乱码的知网文献下载为例,使用各系统及浏览器进行测试。结果如下:

  • Win10 1803版本 中文系统 Edge 浏览器下载文献的文件名为乱码IE 浏览器下载文件名正常Chrome 浏览器下载文件名为乱码
  • macOS 10.13.4 中文系统 Safari 与 Chrome 浏览器下载文件名均正常英文系统中,两种浏览器下载文件名均为乱码
  • Ubuntu 16.04 系统,环境变量LC_ALL="en_US.UTF-8"情况下,Firefox 浏览器下载文件名为乱码

需要说明的是:上述结果仅表明使用这些系统、语言、浏览器组合进行下载时的一般情况,并不能表明该组合下载时完全有或无乱码。这是由于乱码的产生与否,是由系统、浏览器、网站三方共同决定的。

macOS 系统

这里,我同样是使用 Automator 编写了一个文件服务,无需网络,支持批量处理。下载「å 修复文件名乱码.workflow.zip」,解压后双击安装。

服务安装
服务安装

然后,右键单击需要处理的文件,选择服务子菜单中的 å 修复文件名乱码,稍等即可。如果没有这个服务项,就重启试试。

修复演示
修复演示

用 Automator 打开会发现其原理很简单,只有「运行 Shell 脚本」的操作,其中的 Shell 代码为:

for f in "$@"
do
    fileName=$(basename ${f})
    filePath=$(dirname ${f})

    # 两种乱码类型 GBK、UTF-8
    { fileNewName=$(echo $fileName | iconv -f UTF-8-Mac -t latin1 | iconv -f gbk)
    } || { fileNewName=$(echo $fileName | iconv -f UTF-8-Mac -t latin1)
    }

    # 文件名正常或乱码类型不属上述两种时,新文件名为空,则跳过
    if [ -n "$fileNewName" ]; then
        # 避免文件重复:如果已存在修复后的文件名,则在新文件名后加上随机字符串。
        if [ -e ${filePath}/$fileNewName ]; then
            mv "$f" "${filePath}/${fileNewName}-${RANDOM}"
        else
            mv "$f" "${filePath}/${fileNewName}"
        fi
    fi
done

可以看到上述代码是在解决两种乱码情况,其中 GBK 乱码是我们常遇到的,UTF-8 类型的则是由读者在下方评论中提出的,较为少见,顺手加上。

Windows 系统

首先,下载 Python ,双击打开,如下图所示。先勾选「Add Python 3.6 to PATH」,然后点击「Install Now」进行安装,一路下一步。

Win10安装Python
Win10安装Python

然后,下载「文件名乱码修复.bat」,随意放在你喜欢的位置。需要修复文件名乱码时,拖动文件到 文件名乱码修复.bat 上方后释放即可。

Win乱码修复
Win乱码修复

「文件名乱码修复.bat」的内容很简单,只有一句话:

python -c "import sys,os;fp=os.path.dirname(sys.argv[1]);fn=os.path.basename(sys.argv[1]);os.rename(sys.argv[1],os.path.join(fp,fn.encode('latin1').decode('gbk')))" %1

Linux 系统

由于 Linux 各发行版及桌面环境差异较大,这里仅给出核心命令。

echo 文件名乱码 | iconv -t latin1 | iconv -f gbk

通过运行该命令,可得到正常的文件名称,复制后重命名即可。

iOS 与 Android 系统

如果在 iOS、Android 上遇到类似于「自在飞花轻似梦」文件名乱码,那么最好在电脑上重新下载后再修复名称。这是由于移动系统上对文件的处理,不像电脑系统上那么方便。而且也应该避免复制文件名称中的乱码文字,因为乱码中往往存在不可见字符,在复制粘贴过程中可能出现遗漏或错误。

另外,如果繁体中文、日语等语言文字的电脑用户遇到类似的文件名乱码问题,可将本文代码中的gbk改为相应语言的编码名称以尝试解决,如繁体中文 BIG5、日文 JIS。

结语

乱码的出现总是让人烦心的。希望本文介绍的方法能够帮助你解决遇到的问题。

如果你想了解第一种乱码相关的 URL 编码,可以看 这篇文章
第二种乱码相关的字符编码知识,则推荐阅读:

> 下载 少数派 iOS 客户端、关注 少数派公众号,让智能设备更好用 ⚡️