有两种情况,我很困惑:
- 如果新创建的文件仅包含拉丁符号,
file -i
则将显示us-ascii
. - 如果新创建的文件仅包含拉丁文和西里尔文符号,
file -i
则会显示utf-8
我使用几种在 git 存储库的本地副本中创建文件的工具测试了这种行为:intellij idea、nano、echo 等。
但是,当我将此文件推送到远程存储库时,Windows 操作系统上的参与者将此文件确定为 UTF-8。
我有很多来自 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 代码点 的无效第一个字节的测试是:
我知道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 字符。