2 UTF-8
XiaO / 2023-06-01
编码
文本文件有多种编码格式,常见如下:
- ASCII:ASCII(American Standard Code for Information Interchange)是最早的字符编码标准,使用 7 位表示 128 个字符。
- UTF-8:UTF-8(Unicode Transformation Format-8)是一种通用的 Unicode 字符编码,使用可变长度编码,支持全球范围内的字符。
- UTF-16:UTF-16(Unicode Transformation Format-16)是一种 Unicode 字符编码,使用 16 位编码表示字符。
- UTF-32:UTF-32(Unicode Transformation Format-32)是一种 Unicode 字符编码,使用 32位 编码表示字符。
- GB2312:GB2312 是早期的简体中文字符编码标准,后来被 GBK 所取代。
- GBK:GBK(GuoBiao-KuoZhan)是中文编码标准之一,支持简体中文和繁体中文字符。
- Big5:Big5 是台湾中文编码标准,用于繁体中文字符。
- ISO-8859-1:ISO-8859-1,也称为 Latin-1,是 ISO 制定的西欧字符编码标准。 Shift_JIS:Shift_JIS 是一种日文字符编码标准,常用于日本。
UTF-8、UTF-16 和 UTF-32 的区别:
- 存储方式:UTF-8 是一种变长编码,使用 1 到 4 个字节来表示不同的 Unicode 字符。UTF-16 使用 16 位(2 个字节)来存储大部分常见字符,对于较少使用的字符使用双字节或四字节表示。UTF-32 则使用 32 位(4 个字节)来存储每个 Unicode 字符,无论其常见性。
- 字符表示范围:UTF-8 可以表示 Unicode 字符集中的所有字符,包括常见字符和罕见字符。UTF-16 与 UTF-32 同样可以表示 Unicode 字符集中的所有字符。
- 存储空间:由于 UTF-8 是变长编码,对于包含大量 ASCII 字符的文本,UTF-8 相对于 UTF-16 和 UTF-32 可以更节省存储空间。UTF-16 对于大部分常见字符来说相对节省存储空间,但对于罕见字符可能占用更多空间。UTF-32 则在存储空间上通常比 UTF-8 和 UTF-16 更占用空间。 兼容性:UTF-8 是互联网上最常用的 Unicode 编码,因为它兼容 ASCII 编码,可以在不引起冲突的情况下逐步采用。UTF-16 在一些平台和应用程序中被广泛使用,如 Windows 系统和 Java 编程语言。UTF-32 主要在某些特定应用中使用,如操作系统内核或特定计算环境。
乱码
如果文件使用的编码格式与打开文件所用工具的编码格式不匹配,就会导致乱码。确保使用正确的编码格式打开文件。
在实践中,通常可以通过编码转换工具将文本文件的编码格式进行转换。然而,需要注意的是,转换过程中可能会出现一些字符无法准确表示的问题,因为不同编码之间的字符映射并非完全相同。因此,在转换编码时,应确保目标编码能够正确表示源文本中的所有字符。
转码
文件编码自动识别工具 uchardet 是一个编码检测库,它可以对没有附加信息的未知字符编码的字节序列进行处理,并试图确定文本的编码。返回的编码名称与 iconv 兼容。
安装 uchardet:
brew install uchardet
使用 Automator 创建如下脚本:
export PATH=/usr/local/bin:$PATH
for f in "$@"; do
file_path=$(dirname "$f")
file=$(basename "$f")
file_name="${file%.*}"
ext="${file##*.}"
supported_ext=("txt" "md" "lrc" "sub" "srt" "log" "cue") # add other file extensions here
if [[ " ${supported_ext[@]} " =~ " ${ext} " ]]; then
encoding=$(uchardet "$f") # Detect the original encoding
iconv -f "$encoding" -t UTF-8 "$f" > "$file_path/$file_name.tmp.$ext" && mv "$file_path/$file_name.tmp.$ext" "$file_path/$file_name.$ext" # Convert to UTF-8 and save with the same name
else
echo "File extension is not supported for conversion: $ext"
fi
done
下载并安装该 Workflow,即可使用。
当然了,对于个别无关紧要的文件,也可以使用在线编码转换工具,简单粗暴但解决问题。