有一个纯文本文件,Emacs 无法正确显示,但less
可以。
我想知道是否less
自动检测每个单独文本文件的编码方法,或者仅对所有文本文件使用单一默认编码方法?
如何找出less
用于解码文本文件的编码方法?
答案1
可执行less
文件本身不进行任何编码转换:它将可打印字符直接发送到终端。什么被视为可打印是由LESSCHARSET
环境变量控制的(有关详细信息,请参阅手册页),但一般来说,您不想触及它。因此,基本上,编码是从区域设置获得的(除非有特定设置)。
LESSOPEN
如果设置了环境变量,则可以过滤输入,特别是进行转换。相应的过滤器可以告诉你是否做了一些转换;lesspipe
例如,沃尔夫冈·弗里贝尔就是这样做的。
您可以使用该file
实用程序来获取编码。例如:
$ file my_file.txt
my_file.txt: UTF-8 Unicode text
这可能比依赖更好less
。
答案2
less
在当今的大多数系统上将使用 UTF-8。从man less
:
If neither LESSCHARSET nor LESSCHARDEF is set, but any of the strings "UTF-8", "UTF8", "utf-8" or "utf8" is found in the LC_ALL, LC_CTYPE or LANG environment variables, then the default character set is utf-8. If that string is not found, but your system supports the setlocale interface, less will use setlocale to determine the character set. setlocale is controlled by setting the LANG or LC_CTYPE environment variables. Finally, if the setlocale interface is also not available, the default character set is latin1.
为了确保less
这种方式有效,创建一个包含以下内容的文件:
阿什查
用 打印它less
。如果所有字符都正确显示,则说明您LANG
包含 UTF-8。使用locale
命令或打印变量查看它$LANG
。现在将您的区域设置更改为名称中不带 UTF-8 的区域设置,例如:
$ export LANG=en_US
再次打印该文件。 Unicode 字符不应正确打印。
我也使用 Emacs,我记得在某些情况下它无法正确显示文件,但less
可以。