如何有条件地重新编码为 UTF-8?

Jon*_*nik 5 linux unix character-encoding conversion utf-8

我正在统一大量文本文件的编码,这些文件随着时间的推移收集在不同的计算机上。我主要是从 ISO-8859-1 到 UTF-8。这很好地转换了一个文件:

recode ISO-8859-1..UTF-8 file.txt
Run Code Online (Sandbox Code Playgroud)

我当然想对所有文件进行自动批处理,并且简单地为每个文件运行上面的代码会出现问题,即已经以 UTF-8 编码的文件的编码将被破坏。(例如,字符“a”最初在ISO-8859-1将出现这样的,视为UTF-8,如果上述重新编码完成两次:? -> ä -> ä

我的问题是,什么样的脚本只会在需要时才运行重新编码,即仅针对尚未在目标编码中的文件(在我的情况下为 UTF-8)?

通过查看重新编码手册页,我无法弄清楚如何做这样的事情。所以我想这归结为如何轻松检查文件的编码,或者至少它是否是 UTF-8。这个答案意味着您可以通过重新编码识别有效的 UTF-8 文件,但是如何识别?任何其他工具也可以,只要我可以在 bash 脚本的条件中使用结果......

小智 7

这条消息很旧,但我想我可以解决这个问题:
首先创建一个名为recodeifneeded的脚本:

#!/bin/bash
# Find the current encoding of the file
encoding=$(file -i "$2" | sed "s/.*charset=\(.*\)$/\1/")

if [ ! "$1" == "${encoding}" ]
then
# Encodings differ, we have to encode
echo "recoding from ${encoding} to $1 file : $2"
recode ${encoding}..$1 $2
fi
Run Code Online (Sandbox Code Playgroud)

你可以这样使用它:

recodeifneeded utf-8 file.txt
Run Code Online (Sandbox Code Playgroud)

因此,如果您想递归运行它并将所有 *.txt 文件编码更改为(假设) utf-8 :

find . -name "*.txt" -exec recodeifneeded utf-8 {} \;
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。

  • 唯一不管原始编码如何都有效的解决方案。 (2认同)

Jon*_*nik 3

这个脚本改编自harrymc的想法,它有条件地重新编码一个文件(基于某些UTF-8编码的斯堪的纳维亚字符的存在),似乎对我来说工作得还不错。

\n\n
$ cat recode-to-utf8.sh \n\n#!/bin/sh\n# Recodes specified file to UTF-8, except if it seems to be UTF-8 already\n\nresult=`grep -c [\xc3\xa5\xc3\xa4\xc3\xb6\xc3\x85\xc3\x84\xc3\x96] $1` \nif [ "$result" -eq "0" ]\nthen\n    echo "Recoding $1 from ISO-8859-1 to UTF-8"\n    recode ISO-8859-1..UTF-8 $1 # overwrites file\nelse\n    echo "$1 was already UTF-8 (probably); skipping it"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n

(批处理文件当然是一个简单的问题,例如for f in *txt; do recode-to-utf8.sh $f; done。)

\n\n

注意:这完全取决于脚本文件本身是否为 UTF-8。由于这显然是一个非常有限的解决方案,适合我碰巧拥有的文件类型,因此请随意添加更好的答案,以更通用的方式解决问题。

\n