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