如何使“少”命令处理 UTF-8?

use*_*474 37 terminal mac-osx utf-8 unicode

在我的 Mac 终端上,打印 UTF-8 可以正常工作,但less不能正常工作。

所以这可以正常工作:

$  echo -e '\xe2\x82\xac'   
€
Run Code Online (Sandbox Code Playgroud)

但是将其管道化为 less 给出了这样的东西:

$  echo -e '\xe2\x82\xac' | less  
<E2><82><AC>
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

对于诊断:

我使用的是 Mac OS 10.6.8。少版本 418,终端 2.1.2 (273.1)。

我的语言环境的输出是这样的:

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL="C"
Run Code Online (Sandbox Code Playgroud)

use*_*474 50

好的,我在谷歌搜索后找到了答案。显然,LESSCHARSET需要这样设置:

export LESSCHARSET=utf-8
Run Code Online (Sandbox Code Playgroud)

现在less对我来说很好用。

  • 对我来说,解决问题的是使用`less -r`(显示“原始”控制字符) (11认同)
  • `less -r` 做同样的事情,但也能正确处理表情符号,而 `export LESSCHARSET=utf-8` 没有。 (2认同)

小智 6

如果您可以在 中看到一些 unicode 字符less,但无法less显示表情符号,请尝试升级less到更新的版本。在 Mac OS X 上,我从 458 版升级到 481 版,这解决了我的问题(例如,git log现在可以在提交消息中显示表情符号)。

如果你有自制软件,你可以通过运行brew install homebrew/dupes/less.


小智 2

为我工作

LANG=
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"
Run Code Online (Sandbox Code Playgroud)

  • LC_CTYPE 是重要的一个。然而 less 使用的规则很奇怪:它不是从语言环境中检索编码,而是在其名称中查找字符串“utf-8”(或其他一些可能性)。因此,如果您想要一些字符串,则需要使用 LESSCHARSET其他编码或者您的语言环境名称与 less 的先入之见不匹配。 (3认同)