如何测试文本文件的编码...它是否有效,它是什么?

Pet*_*r.O 67 character-encoding utilities text-processing

我有几个.htmGedit中打开的文件没有任何警告/错误,但是当我在Jedit.

HTML 元标记声明“charset=ISO-8859-1”。JEDIT允许备用编码的列表编码自动检测的名单(目前“BOM XML-PI”),所以我的眼前的问题已得到解决。但这让我想到:如果元数据不存在怎么办?

当编码信息不可用时,是否有 CLI 程序可以“最佳猜测”哪些编码可能适用?

而且,虽然这是一个稍微不同的问题;是否有测试已知编码有效性的 CLI 程序?

les*_*ana 94

file命令对编码进行“最佳猜测”。使用该-i参数强制file打印有关编码的信息。

示范:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

这是我创建文件的方式:

$ echo ä > umlaut-utf8.txt 
Run Code Online (Sandbox Code Playgroud)

现在一切都是utf-8。但要说服自己:

$ hexdump -C umlaut-utf8.txt 
00000000  c3 a4 0a                                          |...|
00000003
Run Code Online (Sandbox Code Playgroud)

https://en.wikipedia.org/wiki/Ä#Computer_encoding比较

转换为其他编码:

$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt 
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt 
Run Code Online (Sandbox Code Playgroud)

检查十六进制转储:

$ hexdump -C umlaut-iso88591.txt 
00000000  e4 0a                                             |..|
00000002
$ hexdump -C umlaut-utf16.txt 
00000000  ff fe e4 00 0a 00                                 |......|
00000006
Run Code Online (Sandbox Code Playgroud)

通过混合所有三个来创建“无效”的东西:

$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt 
Run Code Online (Sandbox Code Playgroud)

什么file说:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-mixed.txt:    application/octet-stream; charset=binary
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

没有-i

$ file *
umlaut-iso88591.txt: ISO-8859 text
umlaut-mixed.txt:    data
umlaut-utf16.txt:    Little-endian UTF-16 Unicode text, with no line terminators
umlaut-utf8.txt:     UTF-8 Unicode text
Run Code Online (Sandbox Code Playgroud)

file命令不知道“有效”或“无效”。它只是看到一些字节并试图猜测可能的编码是什么。作为人类,我们可能能够识别出一个文件是一个文本文件,带有一些“错误”编码的变音。但作为一台计算机,它需要某种人工智能。

有人可能会争辩说,启发式算法file是某种人工智能。然而,即使是这样,它也是非常有限的。

以下是有关该file命令的更多信息:http : //www.linfo.org/file_command.html

  • 对于那些使用 Mac 的人来说,它是“file -I”,其中“i”大写而不是小写。 (2认同)

Gil*_*il' 25

并不总是能够确定文本文件的编码是什么。例如,字节序列\303\275c3 bd十六进制)可以是ýUTF-8、ýlatin1、??latin2 或?BIG-5,依此类推。

某些编码具有无效的字节序列,因此可以肯定地排除它们。对于 UTF-8 尤其如此;大多数 8 位编码中的大多数文本都不是有效的 UTF-8。您可以使用isutf8from moreutils或 withiconv -f utf-8 -t utf-8 >/dev/null等来测试有效的 UTF-8 。

有一些工具可以尝试猜测文本文件的编码。他们可能会犯错误,但只要你不刻意欺骗他们,他们就会在实践中发挥作用。

  • file
  • PerlEncode::Guess(标准发行版的一部分)尝试对字节字符串进行连续编码,并返回字符串是有效文本的第一个编码。
  • Enca是一个编码猜测器和转换器。您可以给它一个语言名称和您认为使用该语言的文本(支持的语言主要是东欧语言),然后它会尝试猜测编码。

如果文件中有元数据(HTML/XML charset=、TeX \inputenc、emacs-*-coding-*-等),Emacs 或 Vim 等高级编辑器通常能够解析该元数据。但这并不容易从命令行自动化。


Fal*_*aen 5

我认为这个CLI 工具可能正是您所寻找的!

确保已安装 Node.js 和 NPM:

$ sudo apt install nodejs npm
Run Code Online (Sandbox Code Playgroud)

安装 CLI:

$ sudo apt install nodejs npm
Run Code Online (Sandbox Code Playgroud)

使用 CLI:

$ npm install -g detect-file-encoding-and-language
Run Code Online (Sandbox Code Playgroud)

  • 好吧,第一个答案建议使用“file -i”,不幸的是这并不总是很准确。因此,如果有人正在寻找替代方案,那么安装 Node.js 和 NPM 可能值得付出额外的努力…… (4认同)