编码文件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编码)。