编码文件shell脚本

我如何检查shell脚本中的文件编码? 我需要知道一个文件是否编码在utf-8或iso-8859-1中。

谢谢

我只是使用

file -bi myfile.txt 

确定特定文件的字符编码。

一个具有外部依赖性的解决scheme,但是我怀疑现在所有半现代发行版中的file是非常普遍的。

编辑:

作为对Laurence Gonsalves评论的回应: b是“简短”(不包括文件名)的选项, i--mime的缩写,因此最便携的方式(包括Mac OSX)可能是:

 file --mime myfile.txt 

没有办法100%确定(除非你正在处理一个文件格式,内部陈述其编码)。

大多数尝试做这种区分的工具都会尝试和解码文件为utf-8(因为这是更严格的编码),如果失败,则回落到iso-8859-1。 你可以用iconv “手工”来做到这一点,或者你可以使用file

 $ file utf8.txt utf8.txt: UTF-8 Unicode text $ file latin1.txt latin1.txt: ISO-8859 text 

请注意,ASCII文件兼容UTF-8和ISO-8859-1。

 $ file ascii.txt ascii.txt: ASCII text 

最后:例如,除非您要假定自然语言和使用统计方法,否则没有真正的方法来区分ISO-8859-1和ISO-8859-2。 这可能是为什么文件说“ISO-8859”。

你可以使用文件命令file --mime myfile.text

文件命令不是100%确定的。 简单testing:

 #!/bin/bash echo "a" > /tmp/foo for i in {1..1000000} do echo "asdas" >> /tmp/foo done echo "üöäÄÜÖß " >> /tmp/foo file -b --mime-encoding /tmp/foo 

这个输出:

 us-ascii 

Ascii不知道德国变音器。

文件是一堆字节(字节序列)。 如果不相信元数据(BOM仅针对utf-16和utf-32,MIME,数据头),则无法真正检测到编码。 字节序列可以解释为utf-8或ISO-8859-1 / 2或任何你想要的。 那么如果存在iso-8850-1 / utf-8映射,那么这取决于特定的序列。 你想要的是将整个文件内容编码为所需的字符编码。 如果失败,所需的编码没有这个字节序列的映射。

在shell中可能使用python,perl或者像Laurence Gonsalves所说的iconv。 对于我在Python中使用的文本文件:

 f = codecs.open(path, encoding='utf-8', errors='strict') def valid_string(str): try: str.decode('utf-8') return True except UnicodeDecodeError: return False 

你怎么说一个文件是一个文本文件。 你没有。 您可以逐行编码所需的字符编码。 好的,您可以添加一点信任,并检查是否存在BOM(文件是utf编码)。