Cra*_*nia 11 terminal-emulator terminal character-encoding locale gnome-terminal
我正在尝试了解该$LANG
变量与 gnome-terminal(及其字符编码首选项)的行为方式。我一直在使用 iso8859-1 (latin1) 作为我的主要字符集,并且我所有的文件名都是这样编码的。
对于以下测试,我将创建一个ls -l
文件名中带有西班牙重音字符的目录:
情况1:
LANG
设置为“en_US-iso8859-1”案例#2:
LANG
设置为“en_US-iso8859-1”案例#3:
LANG
设置为“en_US-UTF-8”为什么在最后一种情况下我看到乱码?ls的输出不应该按原样将文件名直接发送到 gnome-terminal 吗?由于 gnome-terminal 是为 ISO-8859-1 配置的,我原以为它们看起来是正确的。
有一段时间我想,也许 bash 正在考虑我的$LANG
变量并执行一些转换。然后我将终端切换到 UTF-8,但我仍然看不到正确的字符。我什至将 ls 的输出通过管道传输到 xxd ,令我惊讶的是,我仍然看到编码的文件:ISO-8859-1。
总结:如果我的列表包含 ISO-8859-1 字符,并且我的终端模拟器配置为相同的字符编码:当LANG
设置为其他时,谁在进行转换?
感谢您的任何帮助,您可以提供。
克拉科尼亚
在 #2 和 #3 的情况下,您混合了两种不同的编码 UTF-8 和 Latin-1。如果 #1 你对两者都使用 Latin-1,所以你没有问题。
该ls
命令(以及所有其他运行良好的程序)使用 LANG 设置来确定编码。
您可以混合使用两种不同的语言,但不应混合使用两种不同的编码。
确保 LC_* 环境变量也使用与 LANG 变量相同的编码。
根据经验,您现在应该将系统配置为仅使用 UTF-8。
如果您必须编辑旧式数据文件(例如 java 属性),您应该使用专门的编辑器(例如 java ide)或确保使用诸如iconv
或 `recode..
您的设置LANG
必须与终端的设置相匹配。更准确地说,您的LC_CTYPE
(字符编码)设置必须与终端的编码匹配,其他区域设置不需要匹配。终端的编码通常由终端仿真器的选项指定,而不是由语言环境变量指定。的LC_CTYPE
结合了两个适应症:它告诉什么编码,以利用所述终端上(包括用于输入和输出)的应用,它告诉什么编码具有文件中使用的应用程序。在第 2 种和第 3 种情况下,您已告知ls
以与终端不同的编码显示输出,因此输出是乱码。
如果您在不同时间使用 UTF-8 和 latin-1 编码,请将终端配置为使用 UTF-8。这应该会导致它设置LC_CTYPE
为指示 UTF-8 的值;不要覆盖此设置。(如果终端模拟器未设置LC_CTYPE
,请在您的 shell 启动文件或整个会话中覆盖它。)要在 UTF-8 终端中使用 latin-1 数据,请使用luit
(包含在 X 实用程序套件中)。
LC_CTYPE=en_US.iso88591 luit
Run Code Online (Sandbox Code Playgroud)
(您可以使用具有相同编码的任何其他语言环境,例如LC_CTYPE=es_ES.iso88591 luit
。)
归档时间: |
|
查看次数: |
15382 次 |
最近记录: |