【发布时间】:2017-10-18 13:38:35
【问题描述】:
我有一个 TXT 文件,它是从一台 Windows 机器上运来的,并以 ISO-8859-1 编码。我的 Qt 应用程序应该读取此文件,但 QString 仅支持 UTF-8(我想避免使用 QByteArray)。我一直在努力寻找在 Qt 中做到这一点的方法,所以我决定编写一个小脚本来为我进行转换。我完全按照我的情况编写它没有问题,但我想让它更通用 - 适用于所有 ISO-8859 编码。
到目前为止,我有以下内容:
#!/usr/bin/env bash
output=$(file -i $1)
# If the output contains any sort of ISO-8859 substring
if echo "$output" | grep -qi "ISO-8859"; then
# Retrieve actual encoding
encoding=...
# run iconv to convert
iconv -f $encoding $1 -t UTF-8 -o $1
else
echo "Text file not encoded in ISO-8859"
fi
我正在苦苦挣扎的部分是如何获取已在grep 命令中成功处理的完整子字符串。
假设我有文件helloworld.txt,它以 ISO-8859-15 编码。在这种情况下
$~: ./fixEncodingToUtf8 helloworld.txt
stations.txt: text/plain; charset=iso-8859-15
将是终端中的output。在grep 内部找到iso-8859(因为我使用-i 标志,它以不区分大小写的方式处理输入)。此时脚本需要“提取”整个子字符串,即不仅仅是iso-8859,而是iso-8859-15,并将其存储在encoding变量中,以便稍后与iconv一起使用(不区分大小写(呸!)它涉及编码的名称)。
注意:上面的脚本可以进一步扩展,只需检索charset 后面的值并将其用于encoding。然而,这有一个巨大的缺陷——如果输入文件的编码具有比 UTF-8 更大的字符集(简单示例:UTF-16 和 UTF-32)怎么办?
【问题讨论】:
标签: bash encoding utf-8 grep iso-8859-1