Веб-браузер для Debian на ARM?

Такое поведение является чисто функцией упорядочения сопоставления, контролируемого локалью LC_COLLATE . Поскольку у вас установлен языковой стандарт Unicode, glibc использует указанный порядок сортировки Unicode в одном из своих определенных вариантов, который пытается быть несколько «естественным».

Этот порядок соответствует UTS 10 Алгоритм сопоставления Unicode , с обрезкой сдвига переменных элементов сопоставления и использованием (вероятно) таблицы элементов сопоставления по умолчанию . Фактически, такие символы, как # , а также большинство других знаков препинания и пробелов, рассматриваются как менее значимые, чем различия между следующими буквенно-цифровыми символами, и используются только для разрыва связей. Весь алгоритм довольно подробно определен в стандарте, и он становится еще более сложным.

Иногда рекомендуется не устанавливать LANG или LC_COLLATE по этой причине . Вместо этого вы можете установить LC_CTYPE (в UTF-8) и LC_MESSAGES (на ваш предпочтительный язык сообщений) и сохранить параметры сортировки по умолчанию POSIX. В любом случае этот выбор имеет побочные эффекты.


В вашей системе это, вероятно, определено в / usr / share / i18n / locales / iso14651_t1_common , который входит в iso14651_t1 , который входит в en_US .Порядок других локалей определяется в соседних файлах, обычно на основе того же значения по умолчанию с локализованными изменениями (например, sv_SE использует ту же основу, но меняет порядок ... zåäöø , сворачивается v и w и т. Д.). Эта таблица, выбранная LC_COLLATE , на самом деле определяет поведение в вашей системе и является производной от (предыдущей версии) стандарта Unicode. В более новых или старых системах, использующих разные версии Unicode, одни и те же строки могут сравниваться по-разному.

Другие кодировки будут иметь свои собственные отдельные таблицы, которые могут быть совершенно не связаны.


Вы можете проверить поведение своей системы на соответствие спецификации, отсортировав файл, содержащий строки из сравнительных таблиц, представленных в UTR:

 demark 
de-Luge 
death {{1 }} deluge 
 ☠sad 
de-luge 
de Luge 
 ☠happy 
de-luge 
sad {{1 }} deLuge 
de luge 
 ♡ happy 
de-Luge 
 

(в этих словах есть дефисы и минусы)

Вы должны получить следующий порядок:

death
deluge
de luge
de-luge
de‐luge
deLuge
de Luge
de-Luge
de‐Luge
demark
☠happy
♡happy
☠sad
♡sad

(Некоторое) пояснительное объяснение этого результата дано в отчете:

  • Сдвиг . Дефис-минус и дефис сгруппированы вместе, и их
    различия менее значительны, чем различия в регистре
    буквы «l». Эта группировка является результатом того факта, что они
    игнорируются, но их различия четвертого уровня соответствуют исходному первичному порядку
    , который является более интуитивным, чем порядок Unicode.
    Символы ☠ и ♡ игнорируются на уровнях 1–3.

  • Обрезка сдвигом .Обратите внимание на то, как «deLuge» ставится между версиями, заключенными в регистр, с пробелами и дефисами. Символы ☠ и ♡ игнорируются на уровнях 1-3.

Это немного плотно. «Уровни 1-3» - это разные уровни веса тай-брейка в алгоритме, причем первичный уровень 1 является наиболее важным отличительным признаком. Вероятно, это больше информации, чем вам уже нужно, но вы, по крайней мере, можете определить, что именно указанный порядок сортировки создает результат, который вы видите.

1
13.04.2017, 15:36
0 ответов

Теги

Похожие вопросы