2009-04-30 74 views
172

我需要找到放置在目录中的所有文件的编码。有没有办法找到使用的编码?如何在Unix中通过脚本查找文件的编码

file命令无法做到这一点。

我感兴趣的编码是:ISO-8859-1。如果编码是别的,我想将文件移动到另一个目录。

+0

如果你有一个你可能想使用什么样的脚本语言的想法,标签功能与你的问题该语言的名称。这可能有帮助... – MatrixFrog 2009-04-30 05:35:29

+1

或者他只是想构建一个shell脚本? – scraimer 2009-04-30 05:42:40

+1

这将是“哪种脚本语言”的答案。 – bignose 2009-04-30 06:10:21

回答

254

听起来就像你正在寻找enca。它可以猜测甚至在编码之间进行转换。只要看看man page

或者,如果不成功,请使用file -i(linux)或file -I(osx)。这将输出文件的MIME类型信息,该信息还将包含字符集编码。我也发现了一个man-page :)

1

这不是你可以以一种万无一失的方式做的事情。一种可能性是检查文件中的每个字符,以确保它不包含0x00 - 0x1f0x7f -0x9f范围内的任何字符,但正如我所说的,这对于任何数量的文件都可能是正确的,包括至少一个其他变体ISO8859。

另一种可能性是在所有支持的语言中查找文件中的特定单词并查看是否可以找到它们。

因此,例如,在8859-1的所有支持的语言中查找英语“and”,“but”,“to”,“of”等等,看他们是否有大量的数字文件中出现的事件。

我说的不是直译,如:

​​

虽然这是可能的。我在谈论目标语言中的常见词汇(据我所知,冰岛人没有“和”的词 - 你可能不得不用他们的词来表达“鱼”[抱歉,这有点刻板印象,我没有意味着任何攻击,只是说明一点])。

4

真的很难确定它是否是iso-8859-1。如果您的文本只有7位字符,也可能是iso-8859-1,但您不知道。如果你有8位字符,那么高位区域字符也按顺序编码。因此,你将不得不使用字典来更好地猜测它是哪一个字,并从那里确定它必须是哪个字母。最后,如果你检测到比你确定它是不是ISO-8859-1这可能是UTF-8

编码是最难的事情要做,因为你永远不知道如果不告诉你

-2

使用Perl,使用Encode :: Detect。

3

如果你谈论的是XML的文件(ISO-8859-1),里面他们XML声明指定编码:<?xml version="1.0" encoding="ISO-8859-1" ?>
所以,你可以使用正则表达式(与perl EG)检查每一个文件对于这样的规范。
更多信息可以在这里找到:How to Determine Text File Encoding

1

我知道你对一个更一般的答案感兴趣,但ASCII中的好东西在其他编码中通常是很好的。这是一个Python单线程来确定标准输入是否为ASCII。 (我敢肯定,这个工程在Python 2,但我只测试了Python 3下)

python -c 'from sys import exit,stdin;exit()if 128>max(c for l in open(stdin.fileno(),"b") for c in l) else exit("Not ASCII")' < myfile.txt 
52
file -bi <file name> 

如果你喜欢的一堆文件做到这一点

for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done 
18

uchardet - 从Mozilla移植的编码检测器库。

用法:

~> uchardet file.java 
UTF-8 

各种Linux发行版(于Debian/Ubuntu,OpenSuse当中-帕克曼,...)提供的二进制文件。

6

这里有一个例子脚本中使用文件-I和iconv这MacOSX上 工作对于你的问题,你需要使用的iconv代替

#!/bin/bash 
# 2016-02-08 
# check encoding and convert files 
for f in *.java 
do 
    encoding=`file -I $f | cut -f 2 -d";" | cut -f 2 -d=` 
    case $encoding in 
    iso-8859-1) 
    iconv -f iso8859-1 -t utf-8 $f > $f.utf8 
    mv $f.utf8 $f 
    ;; 
    esac 
done 
0

在Cygwin的,这看起来像我的作品MV:

find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done 

例子:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done 

,你可以管,为AWK和科瑞使用iconv命令将所有内容从iconv支持的任何源编码转换为utf8。

例子:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done | awk -F[:=] '{print "iconv -f "$3" -t utf8 \""$1"\" > \""$1"_utf8\""}' | bash 
0

在Debian中,你也可以使用:encguess

$ encguess test.txt 
test.txt US-ASCII 
相关问题