File 如何在Linux上通过脚本找到文件编码?

File 如何在Linux上通过脚本找到文件编码?,file,shell,unix,encoding,File,Shell,Unix,Encoding,我需要找到目录中所有文件的编码。有没有办法找到所使用的编码 命令无法执行此操作 我感兴趣的编码是。如果编码是其他内容,我想将文件移动到另一个目录。听起来像是在寻找enca。它可以猜测,甚至在编码之间转换。只要看看这张照片 或者,如果失败,请使用file-i(Linux)或file-i(OSX)。这将输出文件的MIME类型信息,其中还包括字符集编码。我也找到了一个解决方法:)这不是一个万无一失的方法。一种可能是检查文件中的每个字符,以确保它不包含0x00-0x1f或0x7f-0x9f范围内的任何字

我需要找到目录中所有文件的编码。有没有办法找到所使用的编码

命令无法执行此操作


我感兴趣的编码是。如果编码是其他内容,我想将文件移动到另一个目录。

听起来像是在寻找
enca
。它可以猜测,甚至在编码之间转换。只要看看这张照片


或者,如果失败,请使用
file-i
(Linux)或
file-i
(OSX)。这将输出文件的MIME类型信息,其中还包括字符集编码。我也找到了一个解决方法:)

这不是一个万无一失的方法。一种可能是检查文件中的每个字符,以确保它不包含
0x00-0x1f
0x7f-0x9f
范围内的任何字符,但正如我所说,这可能适用于任何数量的文件,包括至少一个ISO 8859的其他变体

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

因此,例如,在ISO 8859-1的所有受支持语言中查找英语“and”、“but”、“to”、“of”等的等效项,并查看它们是否在文件中大量出现

我不是说直译,比如:

English   French
-------   ------
of        de, du
and       et
the       le, la, les

尽管这是可能的。我说的是目标语言中的常用词(据我所知,冰岛语中没有“和”这个词,你可能不得不用它们的词来表示“鱼”[对不起,这有点老套。我没有冒犯的意思,只是说明了一点]。

很难确定它是否是ISO 8859-1。如果您的文本只有7位字符,也可能是ISO 8859-1,但您不知道。如果您有8位字符,则上部区域字符也存在于顺序编码中。因此,你必须使用字典来更好地猜测它是哪个单词,并从中确定它必须是哪个字母。最后,如果您检测到它可能是UTF-8,那么您确定它不是ISO 8859-1


编码是最难做的事情之一,因为你永远不知道是否什么都没有告诉你。

对于Python,你可以使用模块。

对于Perl,使用Encode::Detect。

如果你在谈论XML文件(ISO-8859-1),其中的XML声明指定了编码:

因此,您可以使用正则表达式(例如,使用Perl)检查每个文件中是否存在此类规范


更多信息可以在这里找到:。

我知道您对一个更一般的答案感兴趣,但ASCII的优点通常适用于其他编码。下面是一个Python单行程序,用于确定标准输入是否为ASCII。(我很确定这在Python 2中是可行的,但我只在Python 3上测试过它。)

sysimport-exit中的python-c,stdin;如果128>max,则退出()否则退出(“非ASCII”)”
-从Mozilla移植的编码检测器库

用法:

~> uchardet file.java
UTF-8

各种Linux发行版(、等)都提供二进制文件。

下面是一个使用
file-I
的示例脚本,它可以在Mac OS X上运行

对于您的问题,您需要使用
mv
而不是
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
在中,这似乎对我有效:

find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done
您可以通过管道将其传输到AWK,并创建一个命令,从iconv支持的任何源编码将所有内容转换为UTF-8

例如:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done
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

在Debian中,您还可以使用:
encguess

$ encguess test.txt
test.txt  US-ASCII

可以使用file命令提取单个文件的编码。我有一个sample.html文件,其中包含:

$ file sample.html 
html:html文档,UTF-8 Unicode文本,具有很长的行

$ file -b sample.html
$ file -bi sample.html
HTML文档,UTF-8 Unicode文本,具有很长的行

$ file -b sample.html
$ file -bi sample.html
text/html;字符集=utf-8

$ file -bi sample.html  | awk -F'=' '{print $2 }'

utf-8

我正在使用以下脚本

  • 查找与SRC_编码的筛选器匹配的所有文件
  • 创建它们的备份
  • 将它们转换为DST_编码
  • (可选)删除备份

  • 要将编码从ISO 8859-1转换为ASCII:

    iconv -f ISO_8859-1 -t ASCII filename.txt
    

    在PHP中,您可以按如下方式进行检查:

    明确指定编码列表:

    php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"
    
    更准确的“mb_列表编码”:

    在第一个示例中,您可以看到我使用了可能匹配的编码列表(检测列表顺序)。 为了获得更准确的结果,您可以通过以下方式使用所有可能的编码:mb\u list\u encodings()

    注意,mb_*函数需要php mbstring:

    apt-get install php-mbstring
    
    使用此命令:

    查找中的f的
    ;执行echo`file-i“$f`;完成
    
    您可以列出目录和子目录中的所有文件以及相应的编码

    如果文件名中有空格,请使用:

    IFS=$”\n
    对于'find.'中的f;执行echo`file-i“$f`;完成
    

    请记住,它会将您当前的Bash会话解释器更改为“空格”。

    如果您知道可能要使用哪种脚本语言,请在问题上标记该语言的名称。这可能会有所帮助……或者他只是在尝试构建一个shell脚本?这将是“哪种脚本语言”的答案。可能与这个答案无关,但一般来说,这是一个提示:当你可以用一个词(“这里的编码”)来描述你的全部疑问时,只需做
    apropos-encoding
    。它搜索所有手册页的标题和说明。当我在我的机器上执行此操作时,根据它们的描述,我看到了3种可能对我有帮助的工具:
    chardet
    chardet3
    chardetect3
    。然后,通过执行
    man chardet
    并阅读手册页,告诉我
    chardet
    正是我所需要的实用程序。更改文件内容时,编码可能会更改。e、 在vi中,当编写一个简单的c程序时,它可能是
    usascii
    ,但在添加一行中文注释后,它变成
    utf-8
    <有限公司
    php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"
    
    apt-get install php-mbstring