Что означает «в локали POSIX»?

Что означает «в локали POSIX»?

Вэтот вопросесть комментарий, который гласит:

Все это из-за непонимания того, что означает «в локали POSIX». (-: Вам действительно стоит попробовать сопоставить греческие строчные буквы с помощью (скажем) sed и [[:lower:]] и удобного набора локалей el_GR.UTF-8. – JdeBP

Итак: что означает «в локали POSIX»?

Бонус: допустимо ли это в POSIX в локалях, отличных от C?

LC_ALL=C grep '[[:lower:]]' file

решение1

Когда POSIX говорит (для «верхнего»)

В локали POSIX только:

АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ

должны быть включены:

это определение локали POSIX. Это означает, что в контексте локали POSIX «верхний» класс символов состоит только из перечисленных символов.

POSIX не определяет никаких других локалей, но системы могут свободно это делать. В результате вы не можете рассчитывать на grep '[[:lower:]]' fileвыполнение чего-либо полезного в локали, отличной от POSIX, если вы ограничиваете себя только POSIX. Однако многие системы определяют другие локали и их классы символов. Например, в системе, использующей локали библиотеки GNU C,

$ echo 'α' | LC_ALL=el_GR.UTF-8 grep '[[:lower:]]'
α

(Предполагается, что el_GR.UTF-8локаль доступна; в производных дистрибутивах Debian быстрый способ убедиться в этом — установить пакет locales-all.)

решение2

Я не совсем понял ваше предложение (в другом вопросе). Однако, похоже, вы неверно истолковали вариант использованияPOSIX-локаль.

Ваше предположение, похоже, заключается в том, что локаль не оченьпользовательДружелюбный. И что его следует скорректировать, чтобы он был таким. ОднакопользовательДружелюбность не является целью локальной настройки posix, это задача других локалей с другими правилами.

Задача локального posix — быть предсказуемым. На самом деле, он также выигрывает от простоты. Как только вы начинаете включать другие языки в стандарт, очень трудно остановиться, и в результате получается стандарт, который требует большого обслуживания и который трудно реализовать.

Я, как разработчик, не могу знать все правила для каждого языка, как сортировать их в "алфавитном" порядке и знать, какие из них являются заглавными, а какие - строчными. Правила для языков, отличных от английского, могут быть очень сложными. Поэтому если вы настроите локальный Posix, включив в него правила для всех остальных языков, вы сделаете его поведение действительно очень непредсказуемым.

Изменения в локали posix действительно могли бы нанести ущерб программному обеспечению, если бы старые системы не соответствовали поведению новых систем. (См. анекдот ниже)


Анекдот

Одна из самых непонятных и сложных для диагностики ошибок, которые я когда-либо видел, была вETL-инструмент"случайно" отбрасывая строки. После кропотливого анализа выяснилось, что программное обеспечение работало нормально, но только если запускалось с LC_COLLATE=C. Это было потому, что при сопоставлении записей оно полагалось на порядок сортировки из базы данных, соответствующий его собственному внутреннему порядку сортировки. Разработчики просто никогда не замечали, что в некоторых локалях числа сортируют текст в алфавитном порядке "0, -1, 1, -2, 2" вместо "-1, -2, 1, 2".

Помимо взаимодействия с пользователем, это демонстрирует реальную потребность в том, чтобы системы вели себя предсказуемым образом, который может быть общим для всех систем.

Связанный контент