в кодировке utf-8 мессинг файлов и grep'ing? - PullRequest
0 голосов
/ 22 сентября 2010

Я играю с bash, испытываю с кодировкой utf-8. Я новичок в Unicode. Следующая команда (ну, их вывод) меня удивляет:

$ locale
LANG = "fr_FR.UTF-8"
LC_COLLATE = "fr_FR.UTF-8"
LC_CTYPE = "fr_FR.UTF-8"
LC_MESSAGES = "fr_FR.UTF-8"
LC_MONETARY = "fr_FR.UTF-8"
LC_NUMERIC = "fr_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

Ok. Два egrep фильтруют строки с одним или тремя символами. Их ввод очень похож, но вывод отличается с символом é. Любое объяснение?

Подробнее о моем окружении:

$ uname -a
Darwin macbook-pro-de-admin-6.local 10.4.0 Ядро Darwin Версия 10.4.0: Пт, 23 апреля 18:28:53 PDT 2010; root: xnu-1504.7.4 ~ 1 / RELEASE_I386 i386
$ egrep -V
egrep (GNU grep) 2.5.1

Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc.
Это бесплатное программное обеспечение; см. источник для условий копирования. НЕТ
гарантия; даже не для ИЗДЕЛИИ или пригодности для особой цели.

1 Ответ

2 голосов
/ 22 сентября 2010

Любая кодировка переменной длины может связываться с инструментами, которые не знают о кодировке и учитывают байты, а не символы, когда вы используете односимвольные подстановочные знаки (потому что инструмент предполагает, что byte = символ).Если вы используете буквенные символы, то для UTF-8 это не имеет значения, поскольку структура UTF-8 предотвращает совпадения в середине символа (при условии правильного кодирования).

Как минимум some версии grep должны быть осведомлены о UTF-8, в соответствии с http://mailman.uib.no/public/corpora/2006-December/003760.html, GNU grep 2.5.1 и более поздних версий включается туда, если установлен соответствующий LANG.Однако, если вы используете более старую версию или что-то иное, чем GNU grep, это, вероятно, будет причиной вашей проблемы, поскольку é является двухбайтовым символом (0xC3 0xA9).

РЕДАКТИРОВАТЬ: на основе вашегонедавний комментарий, ваш grep, вероятно, поддерживает Unicode, но он не выполняет никакой нормализации Unicode (и я бы не стал этого ожидать, если честно).

0x650xCC 0x81 - это e, за которым следует КОМБИНИРОВАНИЕ ОСТРОГО АКЦЕНТА (U + 0301) .Это фактически два символа, но он отображается как один из-за семантики объединения символов.Это тогда заставляет grep определять его как два символа;один для e и один для акцента.

Кажется вероятным, что разложенный Unicode - это то, как имя файла на самом деле хранится в вашей файловой системе - в противном случае, вы можете хранить файлы, которые, для любых целей и задач, имеютодно и то же имя, но отличаются только сочетанием символов.

...