我有一个根据以下方式编码的文本文件file
:
ISO-8859文字,带有CRLF线路终止符
此文件包含带有重音的法语文本。我的外壳程序能够显示重音,并且emacs
在控制台模式下能够正确显示这些重音。
我的问题是more
,cat
和less
工具不正确显示此文件。我猜这意味着这些工具不支持此字符编码集。这是真的?这些工具支持哪些字符编码?
我有一个根据以下方式编码的文本文件file
:
ISO-8859文字,带有CRLF线路终止符
此文件包含带有重音的法语文本。我的外壳程序能够显示重音,并且emacs
在控制台模式下能够正确显示这些重音。
我的问题是more
,cat
和less
工具不正确显示此文件。我猜这意味着这些工具不支持此字符编码集。这是真的?这些工具支持哪些字符编码?
Answers:
您的外壳可以显示重音等,因为它可能正在使用UTF-8。由于所讨论的文件是不同的编码,less
more
并且cat
正在尝试将其读取为UTF并失败。您可以使用来检查当前的编码
echo $LANG
您有两种选择,可以更改默认编码,也可以将文件更改为UTF-8。要更改编码,请打开终端并输入
export LANG="fr_FR.ISO-8859"
例如:
$ 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!
如果您正在使用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!
对于Linux系统,ISO-8858字符编码有些过时。您的整个Linux系统很可能一直使用UTF-8。包括终端仿真器和外壳程序。
然而。cat
,grep
并且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
越来越多的猫正在做显示文件的工作。编码之间的转换不在其工作描述中。换行的编码不是问题,因为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
如果文件采用Luit不支持的某种特殊编码,则可以通过翻译器程序将其传输。Iconv支持多种编码。
iconv -f latin1 somefile
iconv -f latin1 somefile | less