Vi.*_*Vi. 8 less character-encoding console text
尝试 1:
$ less subs.srt
"subs.srt" may be a binary file. See it anyway?
<C8><F2><E0><EB><FC><FF><ED> ...
Run Code Online (Sandbox Code Playgroud)
尝试 2:
$ LANG=ru_RU.CP1251 less subs.srt
????? ?????, ??? ??????.
??? ??????? ?????????????! ...
Run Code Online (Sandbox Code Playgroud)
解决方法:
$ iconv -f cp1251 < subs.srt | less
Run Code Online (Sandbox Code Playgroud)
我该如何方便地操作?
要以less
与终端不同的编码运行,请使用luit(随 X11 实用程序套件一起提供)。
LANG=ru_RU.CP1251 luit less subs.srt
Run Code Online (Sandbox Code Playgroud)
如果您想自动检测编码,那就更棘手了,因为文本文件不包含其编码的指示。软件Enca尝试根据文件的语言识别文件的编码:
$ enca -L russian subs.srt
MS-Windows code page 1251
$ iconv -f "$(enca -iL russian subs.srt)" | less
Run Code Online (Sandbox Code Playgroud)
您可以将此组合设置为LESSOPEN
过滤器(例如,请参阅如何以更少的方式查看 gzipped 文件而无需键入 zless?)。然而,对于实际上不是俄语的文本,这可能不会给出好的结果。
如果您只使用 UTF-8 和 CP1251,当文件不是有效的 UTF-8时,您可以回退到 CP1251 — UTF-8 中存在“漏洞”,导致大多数 8 位编码的文件无效UTF-8。概念验证过滤器脚本LESSOPEN
(可能不适用于Linux 以外的系统,因为它依赖于head -c N
准确读取 N 个字节):
#!/bin/sh
head=$(head -c 1000)
if printf '%s\n' "$head" | grep -qav '^.*$'; then
{ printf '%s\n' "$head"; cat; } | iconv -f CP1251
else
{ printf '%s\n' "$head"; cat; }
fi
Run Code Online (Sandbox Code Playgroud)