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

file命令不能做到这一点。

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


当前回答

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

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

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

我说的不是直译,比如:

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

尽管这是可能的。我说的是目标语言中的常用词(据我所知,冰岛语中没有“和”这个词——你可能得用他们的词来表示“鱼”[抱歉,这有点老套]。我没有任何冒犯的意思,只是说明一个观点)。

其他回答

我在一个需要跨平台支持的项目中工作,遇到了很多与文件编码相关的问题。

我做了这个脚本来转换所有的utf-8:

#!/bin/bash
## Retrieve the encoding of files and convert them
for f  `find "$1" -regextype posix-egrep -regex ".*\.(cpp|h)$"`; do
  echo "file: $f"
  ## Reads the entire file and get the enconding
  bytes_to_scan=$(wc -c < $f)
  encoding=`file -b --mime-encoding -P bytes=$bytes_to_scan $f`
  case $encoding in
    iso-8859-1 | euc-kr)
    iconv -f euc-kr -t utf-8 $f > $f.utf8
    mv $f.utf8 $f
    ;;
  esac
done

我使用了一个黑客来读取整个文件,并使用文件-b——mime-encoding -P bytes=$bytes_to_scan $f估计文件编码

在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

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

编码是最难做的事情之一,因为你永远不知道是否没有任何东西告诉你。

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

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

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

$ file sample.html 

HTML: HTML文档,UTF-8 Unicode文本,有很长的行

$ file -b sample.html

HTML文档,UTF-8 Unicode文本,有很长的行

$ file -bi sample.html

短信/ html;charset = utf-8

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

utf - 8