Pet*_*r.O 67 character-encoding utilities text-processing
我有几个.htm
在Gedit中打开的文件没有任何警告/错误,但是当我在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
Gil*_*il' 25
并不总是能够确定文本文件的编码是什么。例如,字节序列\303\275
(c3 bd
十六进制)可以是ý
UTF-8、ý
latin1、??
latin2 或?
BIG-5,依此类推。
某些编码具有无效的字节序列,因此可以肯定地排除它们。对于 UTF-8 尤其如此;大多数 8 位编码中的大多数文本都不是有效的 UTF-8。您可以使用isutf8
from moreutils或 withiconv -f utf-8 -t utf-8 >/dev/null
等来测试有效的 UTF-8 。
有一些工具可以尝试猜测文本文件的编码。他们可能会犯错误,但只要你不刻意欺骗他们,他们就会在实践中发挥作用。
file
Encode::Guess
(标准发行版的一部分)尝试对字节字符串进行连续编码,并返回字符串是有效文本的第一个编码。如果文件中有元数据(HTML/XML charset=
、TeX \inputenc
、emacs-*-coding-*-
等),Emacs 或 Vim 等高级编辑器通常能够解析该元数据。但这并不容易从命令行自动化。
我认为这个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)