终端编码如何在vim中工作?

时间:2012-06-08 00:22:29

标签: vim encoding terminal

在GNOME终端(3.4.1.1)

$ echo $LANG
en_US.UTF-8

$ echo 你好 | iconv -f UTF8 -t UTF32BE | tee hello.txt
O`Y}

在vim(7.3)中:

$ vim -N -u NONE --cmd 'set tenc=utf32 enc=utf32 fencs=utf32be' hello.txt
你好
~
~
~    

:set tenc enc fenc
  termencoding=ucs-4
  encoding=ucs-4
  fileencoding=ucs-4

终端无法显示UTF32个字符 修改了Vim的几个编码选项后 Vim仍然可以毫无问题地显示UTF32 为什么呢?

1 个答案:

答案 0 :(得分:4)

有趣。您可以在script内运行命令,以验证Vim是否实际上正在向您的终端写入UTF-8。

'charconvert''encoding'的帮助提供了关于内部操作的倾斜提示,但我没有找到相应的提示,即相同的行为应用于termencoding。分别为:

  

Vim内部使用UTF-8而不是UCS-2或UCS-4。

  

当使用“unicode”,“ucs-2”或“ucs-4”时,Vim内部使用utf-8。

因此,我们将使用source(特别是版本7.3.548)来了解正在发生的事情。

全局变量storedtermencoding / tenc选项的值为p_tenc

  • did_set_string_option()似乎处理字符串值选项的设置。

    • handling termencoding时,它会调用convert_setup()来设置output_conv(用于将encoding转换为termencoding)。

      convert_setup的评论给出了关于发生了什么的第一个提示:

        

      注意:不能用于从/到ucs-2和ucs-4的转换(将使用utf-8代替)。

        对于{convert_setupfrom} to个参数,
      • _unicode_is_utf8 calls convert_setup_ext()为TRUE。

        • 当{fromto} _unicode_is_utf8为真(它们是)时,它会设置局部变量{fromto} {{1根据指定的编码是否具有ENC_UNICODE属性(ucs-4 does,与Vim的所有_is_utf8utf-…编码一样。) 当到open an iconv时,如果{ucs-…utf-8} from为真,则Vim会替换to。(在这种情况下,它们是)。

最终,_is_utf8encoding的值在此处理方式相同。 utf-32 is mapped to ucs-4,具有ENC_UNICODE,Vim用UTF-8替换所需的编码。也许提交日志中有一些提示表明为什么termencoding被这样对待;不过,我会将考古学留给其他人。

处理termencoding的代码路径不同。它只强制UTF-8用于转换的“内部”(并且仅当“Unicode”fileencoding生效时。)