【问题标题】:Finding files ISO-8859-1 encoded?查找 ISO-8859-1 编码的文件?
【发布时间】:2009-02-26 02:17:08
【问题描述】:

我有一堆混合编码的文件,主要是 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 的文件?

【问题讨论】:

    标签: bash encoding utf-8


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      通常很难仅通过读取文本文件来判断它是否采用 UTF-8 编码。您可以扫描文件以查找在 UTF-8 中永远不会出现的某些 indicator bytes,如果找到它们,您就知道该文件在 ISO-8859-1 中。如果您发现一个设置了高位的字节,而在它之前和之后的字节都没有设置高位,您就知道它是 ISO 编码的(因为字节 >127 总是出现在 UTF 的序列中-8)。除此之外,这基本上是猜测——您必须查看设置了高位的字节序列,看看它们在 ISO-8859-1 中出现是否有意义。

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

      【讨论】:

        【解决方案3】:

        find 很简单

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

        【讨论】:

          【解决方案4】:

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

          可能仅在 bash 中并不那么容易,但对于例如,这是一项微不足道的任务。蟒蛇:

          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 序列(至少有两个按特定顺序排列的最高位字符)在真正的拉丁文本中相对较少,我们倾向于只是在这里和那里使用奇怪的单重音字符。

          【讨论】:

            【解决方案5】:

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

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

            但毕竟,如果始终可以明确地找出文件中使用的字符编码,那么iconv 实用程序就不需要您提供“from”编码。 :)

            【讨论】:

            • UTF-8 文件不应该“正确地”有 BOM(尽管在实践中他们经常这样做。UTF-8 编码的 BOM 完全可以存在于 ISO-8859 的开头-1 文件(这意味着“”)......当然,这不太可能。
            猜你喜欢
            • 1970-01-01
            • 2011-12-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-12
            • 2018-02-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多