Sortowanie łańcuchów z polskimi znakami

Jaka jest sensowna metoda aby posortować łańcuch zawierający polskie znaki?

Instalacja gemu: https://github.com/apohllo/string_pl

EDIT

5 minutes too late

O ciekawe :slight_smile:

Wypchnięty gem ffi-locale to chyba coś innego, więc zainstalowałem prosto z githuba. Niestety nie działa na OSX. :frowning:

[code]OSX:

1.9.3-p194 :020 > FFILocale::setlocale FFILocale::LC_COLLATE, ‘pl_PL.UTF-8’
=> “pl_PL.UTF-8”
1.9.3-p194 :021 > FFILocale::getlocaleinfo
=> {:“pl_PL.UTF-8”=>nil}

Linux:

1.9.3p194 :001 > FFILocale::setlocale FFILocale::LC_COLLATE, ‘pl_PL.UTF-8’
=> “pl_PL.UTF-8”
1.9.3p194 :002 > FFILocale::getlocaleinfo
=> {:LC_CTYPE=>“en_US.UTF-8”, :LC_NUMERIC=>“C”, :LC_TIME=>“C”, :LC_COLLATE=>“pl_PL.UTF-8”, :LC_MONETARY=>“C”, :LC_MESSAGES=>“C”, :LC_PAPER=>“C”, :LC_NAME=>“C”, :LC_ADDRESS=>“C”, :LC_TELEPHONE=>“C”, :LC_MEASUREMENT=>“C”, :LC_IDENTIFICATION=>“C”}
1.9.3p194 :003 >[/code]
Z kolei https://github.com/apohllo/string_pl źle sortuje na moim konkretnym projekcie. Podejrzewam, że coś się pogryzło z innymi monkey-patchami. Zresztą właśnie dlatego wolałbym uniknąć takiej metody. :frowning:

Wrzuć przykład to zobaczymy co jest nie tak. Zawsze można też zgłosić ticket :slight_smile:

Sortuje mi o tak https://raw.github.com/gist/753758eb94badc374395/fa4392eaedff4814d8f8582187110cf7ca3c392d/gistfile1.txt -> litera “Ł” jest w złym miejscu i o dziwno nie na końcu. Oczywiście takie dane na pustym projekcie sortują się poprawnie, wiec nie bardzo jest co zgłaszać.

Sortuje mi o tak https://raw.github.com/gist/753758eb94badc374395/fa4392eaedff4814d8f8582187110cf7ca3c392d/gistfile1.txt -> litera “Ł” jest w złym miejscu i o dziwno nie na końcu. Oczywiście takie dane na pustym projekcie sortują się poprawnie, wiec nie bardzo jest co zgłaszać.[/quote]
A jesteś w stanie określić jakie inne rozszerzenia klasy String są w innych projektach? Projekt jest railsowy? Może Gemfile wystarczy?

To są Railsy, a reopen Stringa / instance_eval / class_eval występuje w sumie ponad 60 razy - nie chce mi się nawet tam zaglądać. :slight_smile: Generalnie ffi-locale mi wystarczy, aczkolwiek mam z nim inny problem i przy okazji może się zapytam tutaj, żeby już nie otwierać nowego wątku z każdym drobiazgiem.

Czy używając własnej metody sortowania można łatwo posortować po kilku kolumnach?

W sensie normalnie mogę sobie zrobić np:

tablica_haszy.sort_by { |x| [ x[:name],  x[:city] ] }

Niestety, używając własnej funkcji sortowania przez .sort { |a,b| … } nie mogę zrobić nic równie prostego, aby uzyskać taki sam efekt.

Sens ma niby coś takiego, ale podejrzewam, że można by to zrobić bardziej generycznie

tablica_haszy.sort { |a,b| 100 * FFILocale::strcoll(a[:name], b[:name]) + FFILocale::strcoll(a[:city], b[:city]) }

Jak imiona będą takie same, to posortuje się po mieście…

Odgrzebuję, ponieważ wróciłem właśnie do tego tematu. Sortowanie via FFI działa tak jak powinno. Niestety mam teraz problem, który jest dla mnie całkowicie niezrozumiały. Aplikacja odpalona via rails server (Webrick) poprawnie sortuje listę. Ta sama aplikacja (w sensie w tym samym miejscu, ta sama baza, to samo środowisko) tylko via nginx i passenger - sortowanie nie działa - polskie litery lądują na końcu. Ma ktoś jakiś pomysł, gdzie w ogóle zacząć szukać?? :frowning:

Podejrzewam, że ma to związek z ustawieniami locale. Porównaj sobie różnice na obu maszynach dla poleceń:

$ env | grep LC_
$ env | grep LANG

Chodziło o Locale - dzięki za naprowadzenie. Mam FFILocale::setlocale(FFILocale::LC_COLLATE, ‘pl_PL.UTF-8’), które odpala się z config/initializers, ale mimo to podczas wywołania strcoll tego ustawienia nie widać. Wpisałem wywołanie setlocale przed samym strcoll i teraz działa super.

Dzięki jeszcze raz.