iTerm2 中的 sv_SE.UTF-8 Bash 和 VIM 问题

iTerm2 中的 sv_SE.UTF-8 Bash 和 VIM 问题

两个具体问题,尽管我在从 sv_SE.iso8859-15 转换为 sv_SE.utf-8 时在旧文件上运行 iconv -f iso-8859-15 我仍然得到扭曲的字符。我相信这是因为 Vim,因为我什至无法再在 Vim 中输入瑞典语 åäö 字符。

第二个问题是在 Bash 中,当打开一个新 shell 或开始一个新行时,我输入的第一个瑞典语 åäö 不会显示,直到我按下产生任何字符的任何第二个键。

因此,在键盘上输入 å/ 只会在终端中显示 å。输入 åäö 将显示 åö,依此类推。它总是忽略我在其中一个字符之后输入的第二个字符,然后开始显示第三个字符。有点像忽略多字节字符中的第二个字节或跳过第二个字节。

编辑:澄清一下,在我输入第一个多字节字符后,其他人直接显示。但是如果我输入 åååå 四次,第一个会被延迟,然后按回车键,然后输入 exit ,结果是 åexit。好像它保存了我在缓冲区中输入的最后一个字符的最后一个字节。

以下是相关的环境配置,如果还需要解决这个问题,请告诉我。

$ cat .inputrc
set show-all-if-ambiguous on
set mark-directories on
set mark-symlinked-directories on
set page-completions off
set visible-stats on
set completion-query-items 9001

set input-meta on
set output-meta on
set convert-meta off

"\e[A": history-search-backward
"\e[B": history-search-forward
"\C-w": backward-kill-word

"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[3~": delete-char

$ locale
LANG="sv_SE.UTF-8"
LC_COLLATE="sv_SE.UTF-8"
LC_CTYPE="sv_SE.UTF-8"
LC_MESSAGES="sv_SE.UTF-8"
LC_MONETARY="sv_SE.UTF-8"
LC_NUMERIC="sv_SE.UTF-8"
LC_TIME="sv_SE.UTF-8"
LC_ALL="sv_SE.UTF-8"

$ locale -a
sv_SE
sv_SE.ISO8859-1
sv_SE.ISO8859-15
sv_SE.UTF-8

根据瑞典 mac 论坛的建议,还在 .inputrc 中尝试过此操作。没有帮助解决上述任何问题。 Terminal.app 和 iTerm2.app 中的症状相同,但 Terminal.app 中的“转义非 ASCII 字符”复选框未选中。

set meta-flag on
set input-meta off
set output-meta on
set convert-meta off

在维姆.

  • 当前语言:“sv_SE.UTF-8/sv_SE.UTF-8/sv_SE.UTF-8/C/sv_SE.UTF-8/sv_SE.UTF-8”
  • 设置编码=UTF-8
  • 设置文件编码=UTF-8

我正在运行 Mac OS Lion 的最新更新以及 iTerm2 的最新测试版。 Terminal.app 中存在同样的问题,因此我希望这是由我的环境引起的。

答案1

就终端问题而言,我会尝试使用已知具有成熟 Unicode 支持的终端模拟器,例如uxterm.如果与区域设置相关的环境变量在启动时可供 shell 可执行文件使用,即不在您的~/.profile或类似的 shell 启动脚本中设置,则会有所帮助。

我不知道这是否对你有帮助,但我通过以下添加修复了与 Vim 相关的 Unicode 问题~/.vimrc

" Unicode options
if has("multi_byte")
    " set the display encoding
    " (default is "", or "utf-8" in the GUI)
    if &termencoding == ""
        " we're probably not using the GUI
        " note: :set won't allow &-replacement
        let &termencoding = &encoding
    endif
    " set the internal encoding
    set encoding=utf-8

    " &fileencoding (controls how characters in the internal encoding will
    " be written to the file) will be set according to &fileencodings
    " (default: "ucs-bom", "ucs-bom,utf-8,default,latin1" when 'encoding'
    "  is set to a Unicode value)
endif " has("multi_byte")

答案2

将区域设置从非基于 UTF-8 的区域设置更改为基于 UTF-8 的区域设置需要的不仅仅是环境设置。它要求使用过的应用程序是建成宽字符支持。您描述的症状表明缺乏此类支持 - 这可能是诸如此类的库的问题slang或者ncurses例如。

尝试寻找类似 OSX 的“UTF-8 迁移指南”之类的内容,它应该指导您如何将某些软件包替换为支持宽字符的版本。事实可能是,您当前使用的某些应用程序(例如终端应用程序)没有支持此功能的选项。但这种可能性不大,因为 UTF 已经得到越来越广泛的使用。

相关内容