Encoding utf-8编码是否会导致文件全球化和grep';惯性导航与制导?

Encoding utf-8编码是否会导致文件全球化和grep';惯性导航与制导?,encoding,utf-8,grep,filenames,Encoding,Utf 8,Grep,Filenames,我在玩bash,体验utf-8编码。我不熟悉unicode。 以下命令(嗯,它们的输出)令我惊讶: $locale LANG=“fr\u fr.UTF-8” LC\u COLLATE=“fr\u fr.UTF-8” LC_CTYPE=“fr_fr.UTF-8” LC_MESSAGES=“fr_fr.UTF-8” LC_MONETARY=“fr_fr.UTF-8” LC\u NUMERIC=“fr\u fr.UTF-8” LC_TIME=“fr_fr.UTF-8” LC_ALL= $printf'

我在玩bash,体验utf-8编码。我不熟悉unicode。 以下命令(嗯,它们的输出)令我惊讶:

$locale
LANG=“fr\u fr.UTF-8”
LC\u COLLATE=“fr\u fr.UTF-8”
LC_CTYPE=“fr_fr.UTF-8”
LC_MESSAGES=“fr_fr.UTF-8”
LC_MONETARY=“fr_fr.UTF-8”
LC\u NUMERIC=“fr\u fr.UTF-8”
LC_TIME=“fr_fr.UTF-8”
LC_ALL=
$printf'1\né\n12\n123\n'| egrep'^(.|…)$'
1
é
12
$touch 1é12 123
$ls|egrep'^(.|…)$'
1
123

嗯。两个egrep过滤器使用一个或三个字符过滤行。它们的输入非常相似,但输出因字符而异。有什么解释吗

有关我的环境的更多详细信息:

$uname-a
达尔文macbook-pro-de-admin-6.local 10.4.0达尔文内核版本10.4.0:Fri Apr 23 18:28:53 PDT 2010;根目录:xnu-1504.7.4~1/RELEASE_I386 I386
$egrep-V
白鹭(GNU grep)2.5.1

版权所有1988,1992—1999年,2000, 2001免费软件基金会,BR> 这是自由软件;有关复制条件,请参见源。没有
担保甚至不是为了适销性或适合某一特定目的


当您使用单字符通配符时,任何可变长度编码都可能与不知道编码的工具发生冲突,并考虑字节而不是字符(因为该工具假定字节=字符)。如果使用文字字符,那么对于UTF-8来说,这并不重要,因为UTF-8的结构防止了字符中间的匹配(假设正确的编码)。 根据GNU grep 2.5.1和更高版本,至少有一些版本的grep应该是UTF-8感知的,只要设置了适当的LANG,就包括在其中。但是,如果您使用的是较旧的版本,或者GNU grep以外的其他版本,那么这很可能就是问题的原因,因为é是一个双字节字符(0xC3 0xA9)

编辑:根据您最近的评论,您的grep可能支持Unicode,但它不执行任何类型的操作(老实说,我并不真的期望它会这样)

0x65 0xCC 0x81是一个e,后跟。这实际上是两个字符,但由于组合字符的语义,它被呈现为一个字符。这将导致grep将其检测为两个字符;一个代表e,一个代表口音


似乎分解的Unicode是文件名在文件系统中的实际存储方式-否则,您可以存储具有完全相同名称的文件,但是只有在组合字符的使用上有所不同。

比较ls | hextump-C和printf'1\né\n12\n123\n'| hextump-C的输出。如果您没有
hextump
,请尝试
hd
。输出与hextump不同:printf给出0xC3 0xA9,而ls给出0x65 0xCC 0x81表示é。我会试着从这里更深入。Thnx