Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [*nix/Linux] >> Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8
Имя
Сообщение << Старые топики   Новые топики >>
Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 08:28:35.670000   
Cykooz

Сообщений: 14
Оценки: 0
Присоединился: 2009-01-11 19:28:46.860000
Народ, случайно никто не сталкивался с неправильной сортировкой строк в Ubuntu с установленной локалью ru_RU.UTF-8?
У меня получается вот такой парадокс ' 1' < '10' < ' 2' (в строках ' 1' и ' 2' вначале стоит один пробел).
Похоже в ubuntu неправильная таблица LC_COLLATE для ru_RU.UTF-8, потому как если установить LC_COLLATE=en_EN.UTF-8, то сортировка становится правильной (правда на русских символах не проверял).
Вот пример из консоли:
cykooz@cykooz-pc:~$ cat ./data.txt 1 2 10 cykooz@cykooz-pc:~$ cat ./data.txt | sort 1 10 2 cykooz@cykooz-pc:~$ export LC_COLLATE=en_EN.UTF-8 cykooz@cykooz-pc:~$ cat ./data.txt | sort 1 2 10
Post #: 1
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 14:26:53.800000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
Сделай так:hexdump -C data.txt И убедись что содержимое файла именно такое, как ты видишь в текстовом редакторе. А потом будем думать ;)
Post #: 2
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 14:37:26.893333   
Cykooz

Сообщений: 14
Оценки: 0
Присоединился: 2009-01-11 19:28:46.860000
cykooz@cykooz-pc:~$ hexdump -C data.txt 00000000 20 31 0a 20 32 0a 31 30 0a | 1. 2.10.| 00000009 Как видно коды символов идут в порядке возрастания и следовательно сортировка должна выполнятся правильно, но…
Вообщето эту проблему я заметил попытавшись сделать в Postgresql сортировку таблицы по полю, которое содержит как раз подобные строки.
Единственное на что я могу сейчас грешить, дак это на таблицу LC_COLLATE.
Post #: 3
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 15:07:27.796666   
oRb

Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
ппц, сортируются же строки, а не числа.
Для чисел нужен алгоритм натуральной сортировки.
orb@orbuntu:~$ cat sort.txt | sort 1 10 2 orb@orbuntu:~$ cat sort.txt | sort -g 1 2 10
Post #: 4
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 15:35:58.446666   
Cykooz

Сообщений: 14
Оценки: 0
Присоединился: 2009-01-11 19:28:46.860000
quote:

ORIGINAL: oRb
ппц, сортируются же строки, а не числа.

Конечно сортируются строки. Но если я не ошибаюсь, то строки сравиниваются посимвольно, но как в таком случае пробел (в строках ' 1' и ' 2') может быть одновременно и меньше и больше, чем символ '1' (в строке '10')
Post #: 5
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 16:23:17.446666   
oRb

Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
ok, тогда
man sortвидим
quote:

*** WARNING *** The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native byte
values.

делаем
orb@orbuntu:~$ export LC_ALL=C orb@orbuntu:~$ cat sort.txt | sort 1 2 10
Post #: 6
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-04 17:20:54.046666   
Cykooz

Сообщений: 14
Оценки: 0
Присоединился: 2009-01-11 19:28:46.860000
quote:

ORIGINAL: oRb
orb@orbuntu:~$ export LC_ALL=C

Если уж так и делать, то лучше LC_COLLATE=C, покрайней мере все остальные настройки локали (даты, числа и др) остануться русскими. Но по моему это не выход, не уверен что при этом будет правильная сортировка русских букв.
Я ведь почему думаю на таблицу LC_COLLATE для локали ru_RU.UTF-8 - потому что во FreeBSD 6.3 есть проблема с сортировкой русских букв и решается она заменой таблицы LC_COLLATE на правильную. Дак почему же в Ubuntu не может быть подобного косяка?

PS: пробывал вставлять export LC_ALL=C в скрипт запуска демона Postgresql, но это ничего не изменило в методе сортировки им строк.
Post #: 7
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-05 08:55:01.176666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
Мдя. Действительно сортирует как-то странно… По-моему просто sort игнорит пробелы в начале. Как её убедить что игнорить не надо, и как это зависит (и зависит ли?) от LC_COLLATE я не знаю.
Можно покопать проблему глубже, а можно попробовать сказать-таки "export LC_COLLATE=C", или сортировать как числа, или заменить пробелы на нули, или ещё какое-нибудь решение проблемы придумать.

ps. точно-точно. таблицы верны. пробелы игнорятся. `sort -z' сортирует как ожидается. это не баг, это фича )

pps. а возвращаясь к аналогичной проблеме в postresql, могу посоветовать лишь одно – ковырять postresql на предмет того, по каким принципам эта СУБД сортирует строки.
Post #: 8
RE: Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8 - 2009-02-05 09:43:46.973333   
Cykooz

Сообщений: 14
Оценки: 0
Присоединился: 2009-01-11 19:28:46.860000
quote:

ORIGINAL: rgo
… По-моему просто sort игнорит пробелы в начале.


Такое ощущение что он вообще их игнорит, и не важно вначале или в конце они. Вот пример:
cykooz@cykooz-pc:~$ cat ./data.txt 1 1 1 2 110 cykooz@cykooz-pc:~$ cat ./data.txt | sort 1 1 110 1 2 А Postgresql для сравнения строк использует системные функции, поэтому сортировка в нём зависит от настроек системы.
Post #: 9
Страниц:  [1]
Все форумы >> [*nix/Linux] >> Неправильная сортировка строк при LC_COLLATE=ru_RU.UTF-8







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.