more、cat 和 less 支持的字符编码

Man*_*lva 24 command-line less terminal character-encoding more

我有一个文本文件编码如下file

ISO-8859 文本,带有 CRLF 行终止符

该文件包含带有重音符号的法语文本。我的 shell 能够显示重音,并且emacs在控制台模式下能够正确显示这些重音。

我的问题是morecatless工具不正确显示此文件。我猜这意味着这些工具不支持此字符编码集。这是真的?这些工具支持哪些字符编码?

ter*_*don 25

您的外壳可以显示重音等,因为它可能使用 UTF-8。由于有问题的文件是不同的编码,less more并且cat试图将其读取为 UTF 并失败。您可以检查您当前的编码

echo $LANG
Run Code Online (Sandbox Code Playgroud)

您有两种选择,您可以更改默认编码,或将文件更改为 UTF-8。要更改编码,请打开终端并键入

export LANG="fr_FR.ISO-8859"
Run Code Online (Sandbox Code Playgroud)

例如:

$ echo $LANG 
en_US.UTF-8
$ cat foo.txt 
J'ai mal ? la t?te, c'est chiant!
$ export LANG="fr_FR.ISO-8859"
$ xterm <-- open a new terminal 
$ cat foo.txt 
J'ai mal à la tête, c'est chiant!
Run Code Online (Sandbox Code Playgroud)

如果您正在使用gnome-terminal或类似,您可能需要激活编码,例如terminator右键单击和:

在此处输入图片说明

对于gnome-terminal

在此处输入图片说明

您的另一个(更好)选项是更改文件的编码:

$ cat foo.txt 
J'ai mal ? la t?te, c'est chiant!
$ iconv -f ISO-8859-1 -t UTF-8  foo.txt > bar.txt
$ cat bar.txt 
J'ai mal à la tête, c'est chiant!
Run Code Online (Sandbox Code Playgroud)


Bat*_*hyX 5

ISO-8858 字符编码对于 Linux 系统来说有点过时了。您的整个 Linux 系统很可能一直使用 UTF-8。包括您的终端模拟器和您的外壳。

然而。catgrep并且less不进行任何编码转换,他们会将您的 ISO-8859/latin1 文件视为 UTF-8,这将不起作用。

如果 emacs 能够显示它们,那是因为它尝试自动检测使用的编码并且显然成功了。告诉Emacs在将文件保存为UTF-8,你将能够使用cat/ grep/什么就可以了。

如果您知道确切的字符编码(ISO-8859 是它们的集合,您必须知道确切的一个:ISO-8859-1 或 ISO-8859-15 或更糟),您还可以从命令行转换文件:

iconv --from-code ISO-8859-15 your_file -o your_file_as_utf8
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 5

Cat、More 和 Less 只是执行显示文件的工作。编码之间的转换并不在他们的工作描述中。换行符的编码不是问题,因为 CRLF 的显示方式与普通行结尾 LF 一样,但您的终端可能需要 UTF-8 编码的文本,这是当今事实上的标准。

Luit在支持的编码和 UTF-8 之间进行转换。您可以通过设置LC_CTYPE环境变量或使用-encoding选项来告诉 Luit 要翻译哪种编码。例如,要显示 latin-1(又名 ISO 8859-1)文件:

LC_CTYPE=en_US luit less somefile
luit -encoding ISO8859-1 less somefile
Run Code Online (Sandbox Code Playgroud)

如果文件采用 Luit 不支持的某种外来编码,您可以通过翻译程序将其传输。Iconv支持多种编码。

iconv -f latin1 somefile
iconv -f latin1 somefile | less
Run Code Online (Sandbox Code Playgroud)