Answers:
试试chardet Python模块,该模块在PyPi上可用:
pip install chardet
然后运行chardetect myfile.txt
。
Chardet基于Mozilla使用的检测代码,因此只要输入文本足够长即可进行统计分析,它应该给出合理的结果。请阅读项目文档。
正如评论中提到的那样,它相当慢,但是某些发行版还提供了原始C ++版本,因为@Xavier在https://superuser.com/a/609056中找到了。某个地方也有Java版本。
chardet
仍然会给出最正确的猜测,例如./a.txt: GB2312 (confidence: 0.99)
。与刚刚失败并报告“无法识别的编码”的Enca相比。但是,可悲的是,chardet
运行速度非常慢。
chardet <(head -c4000 filename.txt)
在我的用例中,运行速度更快且同样成功。(以防万一,这个bash语法只会将前4000个字节发送到chardet)
chardet==3.0.4
,而命令行工具的实际可执行文件名chardetect
不是chardet
。
我将使用以下简单命令:
encoding=$(file -bi myfile.txt)
或者,如果您只需要实际的字符集(例如utf-8
):
encoding=$(file -b --mime-encoding myfile.txt)
file
仅检测具有特定属性的编码,例如UTF-8或UTF-16。其余的-较旧的ISO8859或它们的MS-DOS和Windows通讯程序-被列为“ unknown-8bit”或类似名称,即使对于chardet
具有99%置信度的文件也是如此。
在基于Debian的Linux上,uchardet软件包(Debian / Ubuntu)提供了命令行工具。请参阅下面的包装说明:
universal charset detection library - cli utility
.
uchardet is a C language binding of the original C++ implementation
of the universal charset detection library by Mozilla.
.
uchardet is a encoding detector library, which takes a sequence of
bytes in an unknown character encoding without any additional
information, and attempts to determine the encoding of the text.
.
The original code of universalchardet is available at
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet
.
Techniques used by universalchardet are described at
http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
uchardet
通过Homebrew 安装时,它也可以在OS X上使用。
iconv
可以正常进行转换。
enca -d -L zh ./a.txt
出现消息失败./a.txt: Unrecognized encoding Failure reason: No clear winner.
如@grawity所述,chardet
它比较松懈,但是速度仍然太慢。
Mozilla在网页中有一个很好的自动检测代码库:http :
//lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/
该算法的详细说明:http :
//www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
回到chardet(python 2.?),此调用就足够了:
python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())' < file
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}
虽然还远远不够完美...
echo "öasd" | iconv -t ISO-8859-1 | python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())'
{'confidence': 0.5, 'encoding': 'windows-1252'}
对于经常使用Emacs的用户,他们可能会发现以下有用的信息(允许手动检查和验证转换)。
此外,我经常发现Emacs字符集自动检测比其他字符集自动检测工具(例如chardet)效率更高。
(setq paths (mapcar 'file-truename '(
"path/to/file1"
"path/to/file2"
"path/to/file3"
)))
(dolist (path paths)
(find-file path)
(set-buffer-file-coding-system 'utf-8-unix)
)
然后,使用此脚本作为参数对Emacs的简单调用(请参阅“ -l”选项)即可完成工作。
UTFCast值得一试。不适用于我(可能是因为我的文件很糟糕),但是看起来不错。
http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/
另外,如果您使用文件-i给您未知
您可以使用此php命令来猜测字符集,如下所示:
在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
python-chardet
Ubuntu Universe库中那样打包了。