查找ISO-8859-1编码的文件?

时间:2009-02-26 02:17:09

标签: bash encoding utf-8

我有一堆文件,其编码混合主要是ISO-8859-1和UTF-8。

我想将所有文件设为UTF-8,但在尝试使用时对这些文件进行批量编码 iconv出现了一些问题。 (文件削减一半等)

我认为原因是iconv需要知道'from'编码,所以如果命令看起来像这样

iconv -f ISO-8859-1 -t UTF-8 in.php -o out.php

但'in.php'如果已经UTF-8编码,会导致问题(如果我错了就纠正我)

有没有办法,我可以列出所有编码不是UTF-8的文件?

5 个答案:

答案 0 :(得分:4)

你找不到绝对是ISO-8859-1的文件,但你可以找到有效的UTF-8文件(与大多数多字节编码不同,你可以合理地保证它们实际上是UTF-8)。 moreutils有一个工具isutf8可以为您执行此操作。或者你可以写自己的,这很简单。

答案 1 :(得分:2)

通过阅读文本文件来判断它是否采用UTF-8编码通常很难说清楚。您可以扫描文件以查找UTF-8中永远不会出现的某些indicator bytes,如果找到它们,则表示该文件位于ISO-8859-1中。如果你找到一个设置了高位的字节,那么紧接在它之前和之后的字节都没有设置它们的高位,你知道它是ISO编码的(因为字节> 127总是出现在序列中UTF-8)。除此之外,它基本上是猜测 - 您必须查看具有该高位集的字节序列,并查看它们是否适合在ISO-8859-1中发生。

file程序会尝试猜测正在处理的文本文件的编码,你可以试试。

答案 2 :(得分:1)

  

有没有办法,我可以列出所有编码不是UTF-8的文件?

也许在单独的bash中不那么容易,但这是一项微不足道的任务,例如。的Python:

import os.path

for child in os.path.listdir(TARGETDIR):
    child= os.path.join(TARGETDIR, child)
    if os.path.isfile(child):
        content= open(child, 'rb').read()

        try:
            unicode(content, 'utf-8')
        except UnicodeDecodeError:
            open(child, 'wb').write(unicode(content, 'iso-8859-1'))

这假设可以被解释为有效的UTF-8序列的任何文件一个(因此可以单独留下),而任何不是必须是ISO-8859-1。

如果这两个是唯一可能的编码,这是一个合理的假设,因为有效的UTF-8序列(在特定顺序中至少有两个顶部位设置的字符)在真正的拉丁文中比较少见,我们倾向于只在这里和那里使用奇怪的单个重音字符。

答案 3 :(得分:0)

什么样的内容? XML?然后是的,如果在顶部正确标记。通用文本文件?我不知道有什么先验的方法可以知道使用了什么编码,尽管有时可能会使用聪明的代码。 “标记”UTF-8文本文件,我的意思是带有Byte-Order mark的UTF-8文本文件? (对于UTF-8,三字节序列“”)可能。字节顺序标记字符不会通常显示为ISO-8859-1编码文件中的前三个字符。 (bobince在对此帖的评论中指出,所以我正在纠正我的帖子。)

出于您的目的,存在可能解决您的大部分问题的工具。 Logan Capaldo在his answer中指出了一个。

但毕竟,如果总是可以明确地弄清楚文件中使用了什么字符编码,那么iconv实用程序就不需要你提供“from”编码。 :)

答案 4 :(得分:0)

找到它很简单

find . -print0 | xargs -0 file | grep 8859