字符编码

出自 ArchWiki

字符编码是将字节解释为可读字符的过程。UTF-8 自 2009 年以来一直是主流编码,并被推广为事实标准 [1]

UTF-8

终端

大多数终端默认使用 UTF-8。但是,有些终端(例如:gnome-terminalrxvt-unicode)需要从 UTF-8 区域设置启动。为此,请将您的区域设置的代码集部分设置为 .UTF-8 并重新加载您的会话。请参阅Locale#设置区域设置以获取说明。

  • xterm - 使用参数 -u8 运行,或配置资源 xterm*utf8: 2

Unicode 字符插入

请参阅List of applications/Utilities#文本输入

  • LibreOffice插入 > 特殊字符中包含一个内置的字符映射表,显示字符块、十六进制和十进制编码。
  • Compose 键:可以设置 XCompose 来插入特殊字符。
  • AltGr 可以设置为访问额外的键盘层级,以提供额外的字符以及 Unicode 控制字符,例如 ZWNJRTL 标记
  • 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-mutagenmp3unicode 进行转换

$ 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
...
注意: Quod Libet 默认支持 utf8 编码。

不正确的挂载编码

通常,挂载的字符集与区域设置不同,可以通过修改 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