- JavaScript


Sortowanie z polskimi znakami


Czy jest jakiś sposób (poza pisaniem własnej procedury) aby zmusić ecma-262 do porównywania po polsku? Chodzi o to aby litera "ą" występowała po "a" a nie po "z".

Rozwiązanie (tzw. Metoda Blatka)

Przedstawiona tu metoda została opracowana calkiem niedawno, ale po dotychczasowych testach wydaje
się dzialać prawidlowo.

Metoda jest szybka, ponieważ nie polega ona na pisaniu wlasnej procedury sortującej. Polega ona na takim przeksztalceniu łańcuchow, zawierających polskie znaki, aby łancuchy te zajęły odpowiednie miejsce podczas zwykłego sortowania/porownania.

W skrócie. Każdy polski znak z ogonkiem jest zamieniany na dwa znaki:
pierwszy, to odpowiadajacy mu znak bez ogonka i drugi, to litera 'ż' (ktora
jest ostatnim polskim znakiem w unicodzie).
W przypadku litery 'ź' (ostatniej w alfabecie polskim), jest ona zamieniana
na ciąg 'zżż'

Kilka przykładów, w jaki sposob są przekształcane łancuchy bezpośrednio przed porownaniem:
świat -> sżwiat
październik -> pazżżdziernik
żółć -> zżożlżcż
okrąg -> okrażg

Tyle teoria. Teraz praktyka.

<script type="text/javascript">
function exPL(x){
return x.toLowerCase().replace(/[ąęśćółńżź]/g,function(s){
  return(s=='ą'?'a':s=='ę'?'e':s=='ś'?'s':s=='ć'?'c':
  s=='ó'?'o':s=='ł'?'l':s=='ń'?'n':s=='ż'?'z':'zż')+'ż'})
 
}
 
//funkcja exPL zamienia dowolny lancuch
//do postaci omowionej powyzej
 
//ponizsze porownanie powinno dac wynik true
alert( exPL('bąk') < exPL('bek') )
 
//w przeciwienstwie do ponizszego, ktore da false
alert( 'bąk' < 'bek' )
 
//przyklad sortowania tablicy
tab=['buk','bęc','bąk','bak','bek']
 
tab.sort(function(A,B,a,b){
a=exPL(A);b=exPL(B)
return a>b?1:a<b?-1:0
 
})
 
//sprawdzenie tablicy po posortowaniu
alert(tab)
</script>

Ważna rzecz! Żeby skrypt działał prawidłowo we wszystkich przeglądarkach,
polskie znaki w dokumencie muszą być prawidłowo zakodowane, zgodnie z
deklaracją w naglówku.
Może się zdarzyć, ze ktoś to napisze w windowsowym notepadzie (win-1250), w
naglówku nic nie zadeklaruje. I wtedy w IE bedzie działać prawidlowo, bo w
IE w-1250 jest domyslne, natomiast w Mozilli sie sypnie... to jeszcze zależy
od ustawień w samej przeglądarce i od ustawień na serwerze.
W każdym razie należy zadeklarować odpowiednie kodowanie i prawidłowo
to zakodować.

?ródło: Google Grupy dyskusyjne


InformacjeRaportuj | Drukuj

Data dodania: 03-10-2017 21:39Autor:admin
Ilość wyświetleń:813Komentarzy: 0
Komentarze
Brak komentarzy.
Dodaj komentarz
Zaloguj się, żeby móc dodawać komentarze.