字符编码
字符编码是将字节解释为可读字符的过程。UTF-8 自 2009 年以来一直是主流编码,并被推广为事实标准 [1]。
UTF-8
终端
大多数终端默认使用 UTF-8。但是,有些终端(例如:gnome-terminal,rxvt-unicode)需要从 UTF-8 区域设置启动。为此,请将您的区域设置的代码集部分设置为 .UTF-8
并重新加载您的会话。请参阅Locale#设置区域设置以获取说明。
- xterm - 使用参数
-u8
运行,或配置资源xterm*utf8: 2
。
Unicode 字符插入
请参阅List of applications/Utilities#文本输入。
- LibreOffice 在插入 > 特殊字符中包含一个内置的字符映射表,显示字符块、十六进制和十进制编码。
- Compose 键:可以设置 XCompose 来插入特殊字符。
- AltGr 可以设置为访问额外的键盘层级,以提供额外的字符以及 Unicode 控制字符,例如 ZWNJ 和 RTL 标记。
- Vim:在插入模式下使用
Ctrl+v
uXXXX
,其中XXXX
是十六进制的 代码点。
URL 编码
URI 只接受 US-ASCII 字符,并使用 百分号编码 来编码非 ASCII 字符。这可能会导致 URI 非常长且难以阅读。
在 Firefox 中,可以通过在 about:config
中启用 browser.urlbar.decodeURLsOnCopy
标志,或者通过在 URL 的开头插入一个空格,然后选择它(包括空格)并复制它来复制解码后的 URL。但是,此技巧在 Chromium 上不起作用,并且没有等效的标志。或者,从 URL 的末尾开始选择,直到 https://
部分之后,然后复制。
对于命令行用法,您可以使用 python 从标准输入翻译编码后的 URL。
$ python3 -c "import sys; from urllib.parse import unquote; print(unquote(sys.stdin.read().strip()))"
故障排除
编码问题通常是由于两个程序使用不同的编码进行通信,其中一方通常不使用 UTF-8,从而导致乱码。
.UTF-8
。否则,从 UTF-8 转换为非 Unicode 编码可能会导致信息丢失。不正确的压缩包编码
在旧版本的 Windows(XP、Vista 和 7)上,文件资源管理器在使用某些区域设置创建 zip 压缩包时使用不同的编码。要正确解压缩,请使用 unzip -O
后跟目标编码。例如:CP936 是旧版本 Windows 中常用的编码。
$ unzip -O CP936 file.zip
如果不确定所需的字符集,请添加 -l
标志进行不解压的试运行
$ unzip -lO SJIS file.zip
日文版本的 Windows 使用 Shift-JIS 编码 ZIP 压缩包。使用 shift-jis
$ unzip -O shift-jis nihongo.zip
中文版本的 Windows 使用 gbk 编码 ZIP 压缩包
$ unzip -O gbk file.zip
或者,使用 unzip-natspecAUR 来自动检测目标编码。
不正确的文件名编码
使用 convmv 进行编码转换 mv
$ convmv -f SOURCE_ENCODING -t UTF-8 --nosmart file
默认情况下,convmv 显示将要执行的操作,而不会实际移动。在使用 -f
找出原始编码后(例如:中文为 GBK
),添加 --notest
选项以继续移动操作。
默认情况下,如果文件名已采用 UTF8 编码,convmv 会跳过文件名转换。使用 --nosmart
选项强制转换。
使用 convmv --list
查找支持的编码。
不正确的文件编码
使用 iconv
命令转换格式。例如
$ iconv -f SOURCE_ENCODING -t UTF-8 -o new-file origin-file
-f
指定原始编码,-t
指定输出编码。使用 iconv -l
查询所有支持的编码,使用 -o
指定输出文件。
Vim
如果区域设置为 UTF-8,则打开其他字符编码的文件可能会出现乱码。您可以添加到 vimrc 中添加类似以下行的回退
set fileencodings=utf8,cp936,gb18030,big5
或者,您可以明确设置它::set fileencoding=ansi
。Vim 将通过 iconv 自动进行转换。请参阅 :h charset-conversion
。
不正确的 MP3 ID3 标签编码
要修改 MP3 文件标签,请使用 python-mutagen 或 mp3unicode 进行转换
$ mid3iconv -e SOURCE_ENCODING file.mp3
如果不需要修改文件,您可以调整媒体播放器的行为。对于使用 GStreamer 作为后端的播放器,例如 Rhythmbox 和 totem,设置环境变量
GST_ID3_TAG_ENCODING=GBK:UTF-8:GB18030
Quod Libet 播放器支持标签编辑和设置 ID3v2 编码。转到文件 > 插件 > 高级首选项(或对于 quodlibet-gitAUR,转到文件 > 首选项 > 高级),单击我知道我在做什么,然后在ID3 编码字段中输入以空格分隔的编码列表。您也可以手动编辑配置文件
~/.config/quodlibet/config
... [editing] id3encoding = gbk ...
不正确的挂载编码
通常,挂载的字符集与区域设置不同,可以通过修改 fstab 来设置。如果区域设置为 utf8,请修改该行为
/etc/fstab
... /dev/sdxx /media/win ntfs defaults,iocharset=utf8 0 0
如果区域设置为 GBK,则应为
/etc/fstab
... /dev/sdxx /media/win ntfs defaults,iocharset=cp936 0 0 ...
不正确的 Samba 编码
当使用 Arch 作为 Samba 服务器时,将以下行添加到 /etc/samba/smb.conf
可以解决 Windows 客户端的乱码问题
/etc/samba/smb.conf
... unix charset=gb2312 ...
不正确的 FTP 编码
如果您使用 UTF8 区域设置,则从非 Unicode 编码的服务器下载的文件名可能会出现乱码。对于 lftp,在 .lftp/rc
下进行以下设置
.lftp/rc
... set ftp:charset "gbk" set file:charset "UTF-8" ...
对于 gftp,您可以在 .gftp/gftprc
中进行以下设置
.gftp/gftprc
... remote_charsets=gb2312 ...
但是,下载的文件名仍然是乱码,需要修补和编译。补丁地址为:https://www.teatime.com.tw/%7Etommy/linux/gftp_remote_charsets.patch