【问题标题】:OS X Terminal UTF-8 issuesOS X 终端 UTF-8 问题
【发布时间】:2011-06-04 03:25:15
【问题描述】:

好的,在使用 15 年的 linux 之后,我终于给自己买了一台 MacBook Air。在我得到它之前,我最关心的是 UTF-8 支持,因为无论我从 windows 或 mac-clients 发送给我的文件总是存在编码问题,而在 ubuntu 上,我可以确定所有输出,无论什么程序会生成完美的 utf-8 编码数据。

现在,在我使用 OS X 的第二天(今天),我因沮丧而撕裂了我的头发。为什么?

当我打开 Nano 并在其中输入一些瑞典字符(如 ÅÄÖ)时,它会在行尾显示空白字符(我猜这是每个字符中的另一个字节)

当我打开 python 并尝试使用瑞典字符时,它根本不输出任何内容

当我通过 SSH 连接到 Ubuntu 服务器时,我无法在 bash 中输入 åäö,这很难在 VIM 中运行(仍然通过 SSH)。在 nano 中退格不起作用,但如果在终端首选项中选中“删除发送 ctrl+H”框,退格在 nano 中开始工作,但在 VIM 中停止。

我尝试在终端首选项中取消选中所有其他编码然后 UTF-8,但这似乎也不起作用。

我确信每个非美国人都必须有同样的问题,那么我应该解决它们吗?我只想要完整的 UTF-8 支持... :'(

【问题讨论】:

  • 对我来说,我必须取消选中 Terminal->Preferences->Settings->Advanced 下的 Escape non-ASCII input with Control-V 以允许我直接键入非 ASCII 字符(例如 Option-U u获取ü)。

标签: macos vim utf-8 ssh terminal


【解决方案1】:

转到Terminal -> Preferences -> Advanced (Tab) 转到International 并选择Unicode (UTF-8) 作为Character Encoding

然后勾选Set locale environment variables on startup

【讨论】:

  • 然后我可以在这里确认它可以与 vi/python 一起使用,但是 not nano.
  • 顶部菜单上有这个“编码”选项卡,非常具有误导性,在您指向的菜单中设置编码解决了我的所有问题(即使终端中的环境变量已正确设置为 UTF-8 )
【解决方案2】:

使用nano --version 检查nano 是否真的支持UTF-8。这是在 Cygwin 上的:

nano --version
 GNU nano version 2.2.5 (compiled 21:04:20, Nov  3 2010)
 (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
 2008, 2009 Free Software Foundation, Inc.
 Email: nano@nano-editor.org    Web: http://www.nano-editor.org/
 Compiled options: --enable-color --enable-extra --enable-multibuffer
 --enable-nanorc --enable-utf8

注意最后一点。

【讨论】:

    【解决方案3】:

    不幸的是,“首选项”对话框并不总是很有帮助,但通过调整你应该能够让一切正常工作。

    为了能够在终端中输入瑞典语字符,将以下行添加到您的 ~/.inputrc 中(很可能您必须创建此文件):

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

    这应该适用于 utf8 和 bashnano 和许多其他程序中的其他编码。一些程序,如tmux,也依赖于locale。然后,将 export LC_ALL=en_US.UTF-8 添加到您的 ~/.profile 文件应该会有所帮助,但请记住,一些(主要是晦涩的)程序需要标准语言环境,因此如果您在运行或编译程序时遇到问题,请尝试返回 @ 987654330@.

    一些可能有用的参考资料:

    【讨论】:

    • 记得在编辑 .inputrc 后重新启动终端 - 在 tmux 中简单地打开另一个选项卡对我不起作用。
    【解决方案4】:

    对我来说,这有帮助: 我在终端的本地 shell 上检查了语言环境

    $ locale
    LANG="cs_CZ.UTF-8"
    LC_COLLATE="cs_CZ.UTF-8"
    

    然后通过 ssh 连接到我正在使用的任何远程主机,并以 root 身份编辑文件 /etc/profile - 最后我添加了一行:

    export LANG=cs_CZ.UTF-8
    

    下一次连接后,它在 bash、ls 和 nano 中运行良好。

    【讨论】:

    • 许多用户会希望使用“英语(美国)”语言环境而不是捷克语:“en_US.UTF-8”。
    • 是的,请更新这个答案以包括最常见的英语本地:en_US.UTF-8,当我把它放在 LANG 中时它对我有用。
    • /etc/profile 包含一条注释:“除非您知道自己在做什么,否则更改此文件不是一个好主意。最好在 /etc/profile 中创建 custom.sh shell 脚本.d/ 对您的环境进行自定义更改,因为这将防止在未来的更新中进行合并。”
    【解决方案5】:

    因为 nano 是一个终端应用程序。我想这更像是一个终端问题而不是纳米问题。

    我在 OS X 也遇到过类似的问题(终端无法输入和查看汉字)。

    我尝试通过 OS X UI 调整系统设置,其真正效果是更改环境变量 LANG。

    所以最后我只是在 ~/.bashrc 中添加一些东西来解决问题。

    # I'm Chinese and I prefer English manual
    export LC_COLLATE="zh_CN.UTF-8"
    export LC_CTYPE="zh_CN.UTF-8"
    export LC_MESSAGES="en_US.UTF-8"
    export LC_MONETARY="zh_CN.UTF-8"
    export LC_NUMERIC="zh_CN.UTF-8"
    export LC_TIME="zh_CN.UTF-8"
    

    顺便说一句,不要设置 LC_ALL,这会覆盖所有其他 LC_* 设置。

    【讨论】:

      【解决方案6】:

      要使nano 按您的意愿工作,请尝试:

      export LANG="UTF-8"
      

      或者通过MacPorts获取更新版本的nano

      # cf. http://www.macports.org/install.php
      port info nano
      port variants nano
      sudo port install nano +utf8 +color +no_wrap
      

      关于 ssh 和 UTF-8 问题,请在 /etc/ssh_config 中注释掉 SendEnv LANG LC_*

      见:Terminal in OS X Lion: can't write åäö on remote machine

      【讨论】:

      • 这对我有用:(1) 在我的本地 /etc/ssh_config 中注释掉 SendEnv LANG LC_* 并且 (2) 在远程主机上执行 export LANG=en_US.UTF-8
      【解决方案7】:

      以下是您在 OS X Mavericks (10.9) 下需要执行的操作的摘要。这一切都总结在

      http://hints.macworld.com/article.php?story=20060825071728278

      1. 转到终端->首选项->设置->高级。

        International下,确保字符编码设置为Unicode (UTF-8)

        另外,这是关键:在 Emulation 下,确保未选中 Escape non-ASCII input with Control-V(即 不是 em> 设置)。

        这两个设置解决了终端问题。

      2. 确保您的语言环境设置为以.UTF-8 结尾的内容。输入 locale 并查看 LC_CTYPE 行。如果它没有说类似en_US.UTF-8 的内容(如果您使用非美国英语语言环境,点之前的内容可能会改变),那么在您的主目录中的 Bash .profile.bashrc 中,添加一个像这样的行:

        export LC_CTYPE=en_US.UTF-8
        

        这将解决一般命令行程序的问题。

      3. 将以下行添加到您主目录中的.inputrc(如有必要,请创建它):

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

        这使得 Bash 是 8 位干净的,因此它将传入和传出 UTF-8 字符而不会弄乱它们。

      请记住,您必须重新启动 Bash(例如,关闭并重新打开终端窗口)才能使其注意您在上述 2 和 3 中所做的所有设置。

      【讨论】:

        【解决方案8】:

        我的终端只是装傻,没有打印出åäö。我找到(并设置)了这个设置:

        Terminal -> Preferences... -> Profiles -> Advanced下。

        似乎解决了我的问题。

        【讨论】:

          【解决方案9】:

          简短的通用答案(适合其他国家语言,甚至是立陶宛语或俄语)

          • 打开终端
          • 在主目录 - nano .profile 或 Catalina 或更新的 nano .zshenv 中编辑 .profile
          • 添加行export LC_ALL=en_US.UTF-8
          • 按 Ctrl+x 和 Y(退出并保存)

          这为我解决了即使是小国罕见的民族角色。您可能需要关闭并打开终端才能使更改生效。

          另外,如果您喜欢 Linux 行为(在 mc 中使用很多 Alt 快捷键,例如 Alt+. 或 Alt+),那么您应该禁用 Mac 风格的 Option 键功能: 终端->首选项->配置文件->键盘和复选框: Use Option as Meta key

          【讨论】:

          • 为我工作,但没有尝试其他答案——也许可以通过 GUI 中的设置进行设置
          • 这在 macOS Catalina 上对我有用,将 ~/.profile 替换为 ~/.zshenv 因为 Catalina 使用 Zsh 而不是 Bash。
          • 感谢您对 wd40 的评论,根据您对 Catalina 的说明更新了答案
          【解决方案10】:

          就我而言,只需使用uxterm 命令而不是xterm 即可解决问题。通过安装 Apple 提供的 XQuartz 包可以在/opt/X11/bin/uxterm 中使用。

          【讨论】:

            【解决方案11】:

            试试

            1. 安装了与 Powerline 兼容的字体https://github.com/powerline/fonts
            2. .zshrc.bashrc 中设置这些ENV 变量:
            LANG="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_CTYPE="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_ALL="en_US.UTF-8"

            【讨论】:

              【解决方案12】:

              只需在远程服务器上添加一个文件

              $ sudo nano /etc/environment
              
              LANG=en_US.utf-8
              LC_ALL=en_US.utf-8
              

              PS:最佳答案有一个建议在远程服务器上更改/etc/profile文件,它可以工作,但是这个文件经常被系统覆盖,并且没有长时间的帮助。

              /etc/profile 文件包含免责声明:

              除非您知道自己在做什么,否则更改此文件不是一个好主意。最好在 /etc/profile.d/ 中创建一个 custom.sh shell 脚本来对您的环境进行自定义更改,因为这样可以避免在未来的更新中进行合并。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-09-10
                • 1970-01-01
                • 2017-06-14
                • 2021-09-07
                • 2020-06-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多