В сопоставлении utf-8, почему 11- меньше, чем 1-?

1254
Xiè Jìléi

Я обнаружил, что результат сортировки в ASCII:

Исходный файл test:

1- 11- 1-a 11-a 

Сортировка с использованием ASCII:

$ LANG=en_US.ascii sort test 1- 1-a 11- 11-a 

И используя UTF-8:

$ LANG=en_US.utf8 sort test 1- 11- 11-a 1-a 

Я чувствую, что это так нелогично, и это не порядок словаря.

Разве символ '-' ( 002d) не всегда меньше [0-9]( 0030-0039)? Каково общее правило в сопоставлении UTF-8?

И как это обойти, просто сделать так, чтобы -меньше было, [0-9]а остальные символы оставить неизменными для UTF-8 в Linux? (Таким образом, он может влияет на результат ls --sort, sortи т.д.)

7
Где именно ты это видишь? В `sort` 8.5 из GNU coreutils" 1- "всегда идет перед" 11- "в любой локали. grawity 13 лет назад 3
Это моя ошибка. Я обрезал строки. Я изменил пример, пожалуйста, попробуйте еще раз. Xiè Jìléi 13 лет назад 0
@ Grawity Я вижу это в Gmail, когда открываю zip-файлы. Я вижу это в Win7 с изображениями: 11, 12, 13, ..., 19, 1. Wolfpack'08 9 лет назад 0

2 ответа на вопрос

6
Peter Eisentraut

Знак минус игнорируется при первом проходе. Таким образом, первый проход сорта 1, 11, 1a, 11a. Поскольку 1< a, вы получаете 11a< 1aи, следовательно, 11-a< 1-a.

-является переменным элементом сопоставления, означающим, что вы / разработчик можете игнорировать его. Реализация glibc, очевидно, делает это. На практике это пунктуация влияет на большинство знаков препинания.

Вы можете прочитать подробную информацию в Unicode Collation Algorithm, по модулю, как glibc реализует его.

Тогда есть ли какая-либо конфигурация для glibc, чтобы подавить это невежество? Xiè Jìléi 13 лет назад 0
Не то, чтобы я знал. Peter Eisentraut 13 лет назад 0
0
sleske

Как объяснил Питер Эйзентро, это связано с тем, что алгоритм сортировки для Unicode игнорируется -при сортировке.

Единственный способ обойти это - определить свой собственный языковой стандарт с другими параметрами сортировки (правила сортировки). Это, однако, довольно нетривиально. Кроме того, это даст вам систему с необычными правилами сортировки, которые могут вызвать проблемы с другим программным обеспечением.

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

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