$ echo $LANG
en_US.UTF-8
$ echo 你好 | iconv -f UTF8 -t UTF32BE | tee hello.txt
O`Y}
$ 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
为什么呢?
答案 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)来了解正在发生的事情。
全局变量stored中termencoding
/ tenc
选项的值为p_tenc
。
did_set_string_option()
似乎处理字符串值选项的设置。
当handling termencoding
时,它会调用convert_setup()
来设置output_conv
(用于将encoding
转换为termencoding
)。
convert_setup
的评论给出了关于发生了什么的第一个提示:
注意:不能用于从/到ucs-2和ucs-4的转换(将使用utf-8代替)。
convert_setup
,from
} to
个参数, _unicode_is_utf8
calls convert_setup_ext()
为TRUE。
from
,to
} _unicode_is_utf8
为真(它们是)时,它会设置局部变量{from
,to
} {{1根据指定的编码是否具有ENC_UNICODE属性(ucs-4
does,与Vim的所有_is_utf8
和utf-…
编码一样。)
当到open an iconv
时,如果{ucs-…
,utf-8
} from
为真,则Vim会替换to
。(在这种情况下,它们是)。最终,_is_utf8
和encoding
的值在此处理方式相同。 utf-32
is mapped to ucs-4
,具有ENC_UNICODE,Vim用UTF-8替换所需的编码。也许提交日志中有一些提示表明为什么termencoding
被这样对待;不过,我会将考古学留给其他人。
处理termencoding
的代码路径不同。它只强制UTF-8用于转换的“内部”(并且仅当“Unicode”fileencoding
生效时。)