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


31

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

所以这可以正常工作:

$  echo -e '\xe2\x82\xac'   
€

但是将其管道化成更少的内容是这样的:

$  echo -e '\xe2\x82\xac' | less  
<E2><82><AC>

如何解决?

用于诊断:

我正在使用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"

Answers:


43

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

export LESSCHARSET=utf-8

现在less适合我。


我在CentOS上遇到了同样的问题。这条线也固定在那里。
Wim Deblauwe 2015年

9
对我而言,解决问题的方法是使用less -r(显示“原始”控制字符)
waldyrious

这也适用于Debian 8,谢谢!
lucaferrario '16

有人应该接受这个答案!它解决了这个问题。
lensovet

2
less -r做同样的事情,但也能正确处理表情符号,而export LESSCHARSET=utf-8事实却并非如此。
诺亚·萨斯曼

6

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

如果您有自制软件,则可以通过运行来用新版本较少地替换系统brew install homebrew/dupes/less


谢谢!使用较新版本的自制软件,您只需进行brew install less升级即可。
Alex Ciminian

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"

3
LC_CTYPE是重要的。但是,使用较少的规则很奇怪:它不是在语言环境中检索编码,而是在名称中查找字符串“ utf-8”(或其他几种可能性)。因此,如果需要一些字符串,则需要使用LESSCHARSET其他编码,或者您的语言环境名称与少一些的先入为主。
理查德·基特韦尔

1

我用谷歌搜索并尝试了以下对我有用的环境变量:

export LC_ALL=en_US.UTF-8
export LANG=en_us.UTF-8

当我在多个不同的答案中找到LC_ALL时,我认为这是正确的答案。但是,也许不是唯一的正确答案,对于这个问题,当然可以有更正确的答案。

无论如何,谷歌搜索给了我这个变量的描述:

LC_ALL此变量确定所有语言环境类别的值。LC_ALL环境变量的值优先于以LC_(LC_COLLATE,LC_CTYPE,LC_MESSAGES,LC_MONETARY,LC_NUMERIC,LC_TIME)和LANG环境变量开头的任何其他环境变量。

来源:http : //pubs.opengroup.org/onlinepubs/007908799/xbd/envvar.html

导致我认为这是语言规则来统治他们所有的:)


请随时发布less'版本号。
猎鹿人2014年

当然,少了458个(GNU正则表达式)
Melvin Loos 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.