OS X 终端 UTF-8 问题

Posted

技术标签:

【中文标题】OS X 终端 UTF-8 问题【英文标题】:OS X Terminal UTF-8 issues 【发布时间】: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获取ü)。 【参考方案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@.

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

http://homepage.mac.com/thgewecke/mlingos9.html#unicode http://hints.macworld.com/article.php?story=20060825071728278

【讨论】:

记得在编辑 .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

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

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

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

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

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

    export LC_CTYPE=en_US.UTF-8
    

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

    将以下行添加到您主目录中的.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】:

试试

    安装了与 Powerline 兼容的字体https://github.com/powerline/fonts 在.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 脚本来对您的环境进行自定义更改,因为这样可以避免在未来的更新中进行合并。

【讨论】:

以上是关于OS X 终端 UTF-8 问题的主要内容,如果未能解决你的问题,请参考以下文章

用 Mac OS X 自带的 SSH 登陆 Linux 后出现中文乱码,如何解决?

Mac OS X 上的单声道调整终端大小

在 VT100/xterm 终端(Mac OS X 的终端)中向 Emacs 发送“C-(”?

如何在 Mac OS X 的终端中清除以前的输出?

无法通过终端访问 OS X 中的 adb,“找不到命令”

如何使用 OS X 终端杀死所有同名进程