我有一个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
(当它出现时不区分大小写(p!))以编码的名称。)
注意:只需检索charset
后面的值并将其用于encoding
,即可进一步扩展上述脚本。然而,这有一个巨大的缺陷 - 如果输入文件的编码具有比UTF-8更大的字符集(简单示例:UTF-16和UTF-32),该怎么办?
答案 0 :(得分:2)
您可以使用cut
或awk
来获取此信息:
AWK:
encoding=$(echo $output | awk -F"=" '{print $2}')
切:
encoding=$(echo $output | cut -d"=" -f2)
我认为您可以直接将其提供给iconv
命令并将脚本缩减为:
iconv -f $(file $1 | cut -d"=" -f2) -t UTF-8 file
答案 1 :(得分:2)
或使用下面的bash功能
$ str="stations.txt: text/plain; charset=iso-8859-15"
$ echo "${str#*=}"
iso-8859-15
保存在变量
中$ myvar="${str#*=}"
答案 2 :(得分:1)
嗯,在这种情况下,这是毫无意义的......
$ file --brief --mime-encoding "$1"
iso-8859-15
档案手册
-b, --brief
Do not prepend filenames to output lines (brief mode).
...
--mime-type, --mime-encoding
Like -i, but print only the specified element(s).