我有很多来自 Windows 环境的纯文本文件。
他们中的许多人使用古怪的默认 Windows 代码页,既不是 ASCII(7 位)也不是 UTF-8。
gvim打开这些文件没有问题,但gedit不能这样做。
gvim将编码报告为latin1。
我假设gvim正在对代码页做出“智能”假设。
(我相信这个代码页仍然有国际变体)。
一些问题由此产生:
(1)。有什么方法可以告诉gedit识别这个代码页吗?
**注意。[更新] 对于这一点 (1),请参阅下面的我的回答。
** 对于第 (2) 和 (3) 点。见奥利的回答。(2)。有没有办法扫描文件系统来识别这些问题文件?
(3)。是否有批量转换工具将这些文件转换为 UTF-8?
(.. 这个旧世界的文本混乱实际上是把我带到 Ubuntu 的最后一根稻草......默认情况下 UTF-8 系统范围Brilliant)
[更新]
**注意: **我现在认为以下更新部分无关紧要,因为“问题”文件不是“问题”(请参阅下面的答案)。
我把它留在这里,因为它可能对某人有一些一般用途。
我已经制定了一种粗略且现成的方法来识别问题文件...
该file
命令不合适,因为它将我的示例文件识别为 ASCII...但是 ASCII 文件是 100% UTF-8 兼容...
正如我在下面的评论中提到的,对 UTF-8 代码点 的无效第一个字节的测试是:
- 如果(UTF-8 代码点的)第一个字节介于 0x80 和 0xBF(为其他字节保留)或大于 0xF7(“超长形式”)之间,则认为是错误
我知道sed
(有点,通过 Win32 端口),所以我设法拼凑了一个 RegEx 模式,它可以找到这些违规字节。
这是一条丑陋的线,所以如果正则表达式吓到你,请立即移开视线 :)
如果有人指出如何在范围 []表达式中使用十六进制值,我将不胜感激。我刚刚使用了or运算符\|
fqfn="/my/fully/qualified/filename"
sed -n "/\x80\|\x81\|\x82\|\x83\|\x84\|\x85\|\x86\|\x87\|\x88\|\x89\|\x8A\|\x8B\|\x8C\|\x8D\|\x8E\|\x8F\|\x90\|\x91\|\x92\|\x93\|\x94\|\x95\|\x96\|\x97\|\x98\|\x99\|\x9A\|\x9B\|\x9C\|\x9D\|\x9E\|\x9F\|\xA0\|\xA1\|\xA2\|\xA3\|\xA4\|\xA5\|\xA6\|\xA7\|\xA8\|\xA9\|\xAA\|\xAB\|\xAC\|\xAD\|\xAE\|\xAF\|\xB0\|\xB1\|\xB2\|\xB3\|\xB4\|\xB5\|\xB6\|\xB7\|\xB8\|\xB9\|\xBA\|\xBB\|\xBC\|\xBD\|\xBE\|\xBF\|\xF8\|\xF9\|\xFA\|\xFB\|\xFC\|\xFD\|\xFE\|\xFF/p" "${fqfn}"
所以,我现在将其移植到Oli 的批处理解决方案中......谢谢 Oli!
PS。这是它在我的示例文件中找到的无效 UTF-8 字节……
“H.Bork,Gøte-borg。” ... "ø" = F8 hex ...这是一个无效的 UTF-8 字符。
iconv
可能是您想要使用的。iconv -l
将向您显示可用的编码,然后您可以使用几个命令对它们进行重新编码:如果您想对没有编码的文件执行此操作(因为它们到处都是),您需要引入更多命令:
find
、file
和. 最后两个只是用来处理文件的输出。awk
sed
我不知道这是否真的有效,所以我当然不会从你拥有的最不重要的目录运行它(创建一个包含一些已知 ASCII 文件的测试文件夹)。find 的语法可能会阻止它在 for 循环中。我希望其他有更多 bash 经验的人可以跳到那里并对其进行整理,以便它做正确的事情。
只有在“文件-打开-字符编码”中列出的时候,Gedit 才能检测到正确的字符集。您可以更改此列表,但请记住顺序很重要。
这个问题我想多了……
是的,“ø” = 0xF8 hex* 绝对是gedit无法打开文件的原因......
为什么?因为它不是有效的 UTF-8 字节。
默认情况下,gedit只会打开 UTF-8 文件...
但是,gedit确实具有代码页自动检测功能,但您必须首先将代码页添加到其“可能”列表中。
当gedit无法识别代码页时出现的鲜红色对话框,上面有一个按钮,允许您添加另一个代码页...
问题解决了!...几乎...
这个棘手的问题现在再次抬头......它是哪个代码页?
在我的情况下,我可以合理地假设它是标准的英文 Windows 代码页(对于我的地区?还是对于文件来源的地区?.. 我确实提到了“knarly”:)....
无论如何,一旦您将代码页添加到其列表中 , gedit将允许您加载文件......
因此,尽管所有终端命令本身都是有用且有趣的,但这种思路似乎走错了路。
这些文件本质上没有任何问题......
问题似乎纯粹是关于代码页。
gedit可以打开文件,就像gvim一样。
...但必须首先将相关代码页添加到其代码页列表中。
例如。通过文件打开对话框,或我遇到的红色警告对话框。
您可以使用以下 3 个命令行中的任何一个: