说起「乱码」,没遇到过的电脑用户可能是极少的,尤其在国内中文环境下。暴露年龄的「烫烫烫」系列乱码已经绝迹,现如今遇到的往往是类似「%E9%AB%98%E9%A2%91」和「èªå¨é£è±è½»ä¼¼æ¢¦」的字符串。本文就这两种乱码情况分别给出解决方法。
首先应该说明的是,本文所说的方法是在出现文件名乱码情况下,如何恢复文件名的正确中文名称,并非一劳永逸地避免乱码的出现。这是由于下载文件名称乱码的出现,往往是系统、浏览器、网站三方面因素共同影响导致的,错综复杂。想要避免乱码的出现,只能根据具体的情况,对个人的系统或浏览器做出针对特定网站的调整配置。
%E9类型乱码
这种情况往往是由于网站和浏览器之间存在兼容性问题导致的,我在 macOS 英文系统上使用 Firefox 下载网盘中的文件时就遇到过,这些形如「%E9%AB%98%E9%A2%91」的字符串实际上是文件名的 URL 编码。下面介绍各系统平台上的解决方法。
macOS 系统
macOS系统自带强大的自动化支持,如 Automator 和 AppleScript。这里,我使用 Automator 编写了一个文件服务,使用方法:
首先,下载「
♲ 文件名 UrlDecode.workflow.zip
」,解压后双击安装。
然后,右键单击需要处理的文件,选择 服务 子菜单中的 ♲ 文件名 UrlDecode ,完毕。
这个服务不需要网络,支持批量处理多个文件或文件夹。用 Automator 打开会发现其原理很简单,只有「运行 Shell 脚本」的操作,其中的 Shell 代码为:
# 调用 Python 内置模块进行解码
alias urldecode='python -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"'
# 遍历选择的文件列表,进行重命名
for f in "$@"
newName=$(urldecode "$f")
mv "$f" "$newName"
Windows 系统
相比 macOS, Windows 缺乏友好、易用的自动化工具。在安装 Python 后,可以利用批处理命令调用代码
python -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"
进行文件名修复。但是考虑到该过程略复杂,该类乱码出现频率较低,所以这里不提供工具,而是介绍如何利用在线网站解决问题。
Linux 系统
Linux 各发行版和桌面环境的差异较大,且用户折腾能力较强,这里就不给出具体工具了。可根据自己的实际情况,利用上方的 Shell 代码尝试解决。
iOS 与 Android 系统
手机系统上同样难以做到 macOS 上的「一键修复」,推荐使用上文中 Windows 系统小节的在线网站解决。
èªå 类型乱码
这种乱码的形成过程基本相似,但其中涉及的编码却各有不同,错综复杂。考虑到国内电脑用户遇到的情况,多出现于从国内的政府、院校、企业等网站下载文件时,一般属于同一种类型,即 GBK 编码解码错误。下面将针对此种类型给出解决方法。
首先,我以经常出现乱码的知网文献下载为例,使用各系统及浏览器进行测试。结果如下:
LC_ALL="en_US.UTF-8"
情况下,
Firefox 浏览器
下载文件名为
乱码
。
需要说明的是:上述结果仅表明使用这些系统、语言、浏览器组合进行下载时的一般情况,并不能表明该组合下载时完全有或无乱码。这是由于乱码的产生与否,是由系统、浏览器、网站三方共同决定的。
macOS 系统
这里,我同样是使用 Automator 编写了一个文件服务,无需网络,支持批量处理。下载 「å 修复文件名乱码.workflow.zip」 ,解压后双击安装。
然后,右键单击需要处理的文件,选择服务子菜单中的 å 修复文件名乱码 ,稍等即可。如果没有这个服务项,就重启试试。
用 Automator 打开会发现其原理很简单,只有「运行 Shell 脚本」的操作,其中的 Shell 代码为:
for f in "$@"
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}"
mv "$f" "${filePath}/${fileNewName}"
可以看到上述代码是在解决两种乱码情况,其中 GBK 乱码是我们常遇到的,UTF-8 类型的则是由读者在下方评论中提出的,较为少见,顺手加上。
Windows 系统
首先,下载
Python
,双击打开,如下图所示。先勾选「Add Python 3.6 to PATH」,然后点击「Install Now」进行安装,一路下一步。
然后,下载 「文件名乱码修复.bat」 ,随意放在你喜欢的位置。需要修复文件名乱码时,拖动文件到 文件名乱码修复.bat 上方后释放即可。
「文件名乱码修复.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 客户端 、关注 少数派公众号 ,让智能设备更好用 ⚡️