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

file命令不能做到这一点。

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


当前回答

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

用法:

~> uchardet file.java
UTF-8

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

其他回答

我正在使用以下脚本

找到所有匹配FILTER和SRC_ENCODING的文件 创建它们的备份 将它们转换为DST_ENCODING (可选)删除备份

 

#!/bin/bash -xe

SRC_ENCODING="iso-8859-1"
DST_ENCODING="utf-8"
FILTER="*.java"

echo "Find all files that match the encoding $SRC_ENCODING and filter $FILTER"
FOUND_FILES=$(find . -iname "$FILTER" -exec file -i {} \; | grep "$SRC_ENCODING" | grep -Eo '^.*\.java')

for FILE in $FOUND_FILES ; do
    ORIGINAL_FILE="$FILE.$SRC_ENCODING.bkp"
    echo "Backup original file to $ORIGINAL_FILE"
    mv "$FILE" "$ORIGINAL_FILE"

    echo "converting $FILE from $SRC_ENCODING to $DST_ENCODING"
    iconv -f "$SRC_ENCODING" -t "$DST_ENCODING" "$ORIGINAL_FILE" -o "$FILE"
done

echo "Deleting backups"
find . -iname "*.$SRC_ENCODING.bkp" -exec rm {} \;
file -bi <file name>

如果你喜欢对一堆文件这样做

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

使用这个命令:

for f in `find .`; do echo `file -i "$f"`; done

您可以列出一个目录和子目录中的所有文件以及相应的编码。

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

IFS=$'\n'
for f in `find .`; do echo `file -i "$f"`; done

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

在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_list_encodings":

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

在第一个示例中,您可以看到我使用了一个可能匹配的编码列表(检测列表顺序)。 为了得到更准确的结果,你可以使用所有可能的编码:mb_list_encodings()

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

apt-get install php-mbstring

如果谈论的是XML文件(ISO-8859-1),其中的XML声明指定了编码:<??> . xml version="1.0" encoding="ISO-8859-1" 因此,您可以使用正则表达式(例如,使用Perl)来检查每个文件是否有这样的规范。

更多信息可以在这里找到:如何确定文本文件编码。