Linux 区域设置 - 如何禁用智能引号?

Linux 区域设置 - 如何禁用智能引号?

在我的 Gentoo 系统上,find . -regextype help输出

find: Unknown regular expression type ‘help’; valid types are ‘findutils-default’, ‘awk’, ‘egrep’, ‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’, ‘posix-basic’, ‘posix-egrep’, ‘posix-extended’, ‘posix-minimal-basic’, ‘sed’.

我一直以为智能引号(或无论它们叫​​什么)是微软软件的祸害,事实证明没有人能免受这种丑陋的影响。在我的另一个系统(Cygwin)上,LANG设置为en_US.UTF-8,并且智能引号也会显示。如果我取消设置LANG或将其设置为en.UTF-8,输出将更改为常规单引号:

# unset LANG
# find -regextype help
find: Unknown regular expression type 'help'; valid types are 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-eg
rep', 'posix-extended', 'posix-minimal-basic', 'sed'.

但在前面提到的 Gentoo 系统上,LANG 未设置。无论我尝试将其(和其他语言环境变量)设置为多少,我都会看到智能引号和/或一堆有关语言环境不正确的错误消息。

如何恢复我的单引号?

答案1

这是不是由智能引号系统自动转换。该文本是 GNU 的直接输出find。一些系统范围的智能引号解释器只会影响来自键盘的输入……我从未听说过 GNU/Linux/BSD 的智能引号解释器(我找到这篇文章是因为我在寻找如何英文能够做到!

这是命令输出的十六进制转储:

$ find . -regextype help 2>&1 |head -c99
find: Unknown regular expression type ‘help’; valid types are 
‘findutils-default’, ‘ed’
$ find . -regextype help 2>&1 |head -c99 |hd
00000000  66 69 6e 64 3a 20 55 6e  6b 6e 6f 77 6e 20 72 65  |find: Unknown re|
00000010  67 75 6c 61 72 20 65 78  70 72 65 73 73 69 6f 6e  |gular expression|
00000020  20 74 79 70 65 20 e2 80  98 68 65 6c 70 e2 80 99  | type ...help...|
00000030  3b 20 76 61 6c 69 64 20  74 79 70 65 73 20 61 72  |; valid types ar|
00000040  65 20 e2 80 98 66 69 6e  64 75 74 69 6c 73 2d 64  |e ...findutils-d|
00000050  65 66 61 75 6c 74 e2 80  99 2c 20 e2 80 98 65 64  |efault..., ...ed|
00000060  e2 80 99                                          |...|

这样可以更容易地看到输出使用了显式的左、右单引号行进字符(分别为 U+2018 和 U+2019,请参阅此Unicode 代码点表)。在 UTF-8 中,它们表示为e2 80 98和,这就是为什么您会在(其本身)和其他引用的单词e2 80 99两侧看到三个点(表示非 ASCII 字符) 。help68 56 5c 70

因此,您可以使用以下方法将其转换回来sed

$ find . -regextype help 2>&1 |head -c99 \
  |sed "s/\xe2\x80\x98/'/g; s/\xe2\x80\x99/'/g"
find: Unknown regular expression type 'help'; valid types are 
'findutils-default', 'ed'
$ find . -regextype help 2>&1 |head -c99 \
  |sed "s/\xe2\x80\x98/'/g; s/\xe2\x80\x99/'/g" |hd
00000000  66 69 6e 64 3a 20 55 6e  6b 6e 6f 77 6e 20 72 65  |find: Unknown re|
00000010  67 75 6c 61 72 20 65 78  70 72 65 73 73 69 6f 6e  |gular expression|
00000020  20 74 79 70 65 20 27 68  65 6c 70 27 3b 20 76 61  | type 'help'; va|
00000030  6c 69 64 20 74 79 70 65  73 20 61 72 65 20 27 66  |lid types are 'f|
00000040  69 6e 64 75 74 69 6c 73  2d 64 65 66 61 75 6c 74  |indutils-default|
00000050  27 2c 20 27 65 64 27                              |', 'ed'|

相关内容