Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie tablic w UTF8
Forum PHP.pl > Forum > PHP
piernik
Witam,

chcę posortować tablicę, którą mam w utf8.
sort sobie nie radzi bo polskie krzaczki lądują na końcu.
Jest jakis sposób to posortować poprawnie?

PS. nie chodzi tylko o język polski tekże wypisanie wszystkich polskich krzaczków w kolejności i posotrowanie zgodnie z tym odpada
tsharek
spróbuj
  1. <?php
  2. setlocale(LC_CTYPE, 'pl_PL.UTF8');
  3. ?>
kufalo
  1. <?
  2.  setlocale(LC_CTYPE,'pl_PL.UTF8');
  3.  
  4.  $a=array('ę','ą','z');
  5.  
  6.  sort($a);
  7.  
  8.  print_r($a);
  9. ?>

Z ciekwawosci stworzylem plik jak powyzej zapisany w stronie kodowej UTF-8.
Niestety nie sortuje prawidlowo.
piernik
niente :/nie działamam rozumieć ze tego w php się nie da zrobić questionmark.gifexclamation.gif
JaRoPHP
Cytat(piernik @ 4.09.2007, 05:17:24 ) *
mam rozumieć ze tego w php się nie da zrobić ?

Da się. Zwróć uwagę na drugi paramter funkcji sort" title="Zobacz w manualu PHP" target="_manual.
  1. <?php
  2. setlocale(LC_ALL,'pl_PL.UTF8');
  3. $a=array('ę','ą','z');
  4. sort($a, SORT_LOCALE_STRING);
  5. print_r($a);
  6. ?>

Output:
Cytat
Array
(
[0] => ą
[1] => ę
[2] => z
)
piernik
Niestety nie działa zarówno na localhoście jak i na serwerze (home.pl) czy wymagane są jakies dodatkowe ustawienia serwera?
Sedziwoj
"Dodane w PHP 4.4.0 i PHP 5.0.2"
piernik
Ja mam 5.1.5
Sh4dow
Jest prawdopodobieństwo żeby nie miał ustawionych lokali na serwerze ? zobacz co zwraca setlocale jeśli zwróci to co próbujesz ustawić to powinno działać, jak nie to nie masz zainstalowanych locali na serwerze.
piernik
Dostałem taką odpowiedź z home.pl:
"Obawiam sie, ze locale nie sa na chwile obecna dostepne z poziomu uzytkownika - przepraszam Pana za umiarkowanie pozyteczna sugestie. "

Nieźle :/ lider na rynku :/
sf
Cytat(piernik @ 11.09.2007, 07:55:10 ) *
Dostałem taką odpowiedź z home.pl:
"Obawiam sie, ze locale nie sa na chwile obecna dostepne z poziomu uzytkownika - przepraszam Pana za umiarkowanie pozyteczna sugestie. "

Nieźle :/ lider na rynku :/


Ja w takich sytuacjach piszę dlaczego ta usługa jest ważna, żyjemy w Polsce i brak wsparcia do operacji na polskich znaków wydaje mi się niestosowny i przykry. Ogólnie bardzo się rozczulam dlaczego płacę najwięcej na rynku, a dostaje zdecydowanie mniej niż na innych hostingach. Proszę o kontakt jakiś z górą czy coś. Jeśli nic nie pomaga to stwierdzam, że przykro mi, ale dziękuje za tego typu usługę i przenoszę konta klientów po wygaśnięciu abonamentu do innej firmy hostingowej winksmiley.jpg
piernik
ok jednak jest dostępne locale na home.pl, ale...

  1. <?php
  2. header('Content-Type: text/html; charset=utf-8');
  3. $a=array('a','b','ę','ą','ś','c','z');
  4. setlocale(LC_ALL,'pl_PL.UTF-8');
  5. sort($a, SORT_LOCALE_STRING);
  6. print_r($a);
  7. ?>


wynik sortowania:
a, b, c, z, ą, ę, ś

Odpowiedź z home.pl
"Wyniki sortowania wg. konkretnego locale nijak sie maja do kolejnosci znakow w alfabecie. Wyniki ktore Pan otrzymuje, sa poprawne dla wybranego kodowania."

To jak ja to mam posortować :|
Kicok
Cytat
Wyniki sortowania wg. konkretnego locale nijak sie maja do kolejnosci znakow w alfabecie.


Ehe, jasne ;]


setlocale" title="Zobacz w manualu PHP" target="_manual ma wpływ na sortowanie. Niestety ale wpływ ma również kodowanie pliku i system operacyjny w jakim pracuje serwer WWW:



Przykład 1
Plik zakodowany w ISO-8859-2:

  1. <?php
  2.  
  3.  
  4. setlocale( LC_ALL, 'polish' );
  5.  
  6. $array = array( 'a', 'b', 'c', 'd', 'e', 'f', 'ą', 'ć', 'ę' );
  7. sort( $array, SORT_LOCALE_STRING );
  8.  
  9.  
  10.  
  11.  
  12. header( 'Content-Type: text/html; charset=iso-8859-2' );
  13.  
  14. echo '<pre>' . print_r( $array, true ) . </pre>;
  15.  
  16. ?>

Wynik działania skryptu w systemie Windows:
Kod
Array
(
    [0] => ą
    [1] => a
    [2] => b
    [3] => c
    [4] => ć
    [5] => d
    [6] => e
    [7] => ę
    [8] => f
)

Wynik działania skryptu w systemie Linux:
Kod
Array
(
    [0] => a
    [1] => ą
    [2] => b
    [3] => c
    [4] => ć
    [5] => d
    [6] => e
    [7] => ę
    [8] => f
)




Przykład 2
Plik zakodowany w Windows-1250:

  1. <?php
  2.  
  3.  
  4. setlocale( LC_ALL, 'polish' );
  5.  
  6. $array = array( 'a', 'b', 'c', 'd', 'e', 'f', 'ą', 'ć', 'ę' );
  7. sort( $array, SORT_LOCALE_STRING );
  8.  
  9.  
  10.  
  11.  
  12. header( 'Content-Type: text/html; charset=windows-1250' );
  13.  
  14. echo '<pre>' . print_r( $array, true ) . '</pre>';
  15.  
  16. ?>

Wynik działania skryptu w systemie Windows:
Kod
Array
(
    [0] => a
    [1] => ą
    [2] => b
    [3] => c
    [4] => ć
    [5] => d
    [6] => e
    [7] => ę
    [8] => f
)

Wynik działania skryptu w systemie Linux:
Kod
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => ć
    [4] => d
    [5] => e
    [6] => ę
    [7] => f
    [8] => ą
)




Przykład 3
Plik zakodowany w UTF-8:

  1. <?php
  2.  
  3.  
  4. setlocale( LC_ALL, 'polish' );
  5.  
  6. $array = array( 'a', 'b', 'c', 'd', 'e', 'f', 'ą', 'ć', 'ę' );
  7. sort( $array, SORT_LOCALE_STRING );
  8.  
  9.  
  10.  
  11.  
  12. header( 'Content-Type: text/html; charset=utf-8' );
  13.  
  14. echo '<pre>' . print_r( $array, true ) . '</pre>';
  15.  
  16. ?>

Wynik działania skryptu w systemie Windows:
Kod
Array
(
    [0] => a
    [1] => ć
    [2] => ą
    [3] => ę
    [4] => b
    [5] => c
    [6] => d
    [7] => e
    [8] => f
)

Wynik działania skryptu w systemie Linux:
Kod
Array
(
    [0] => a
    [1] => ą
    [2] => ć
    [3] => ę
    [4] => b
    [5] => c
    [6] => d
    [7] => e
    [8] => f
)




Jak widać Windows radzi sobie z sortowaniem polskich liter, jeśli są zakodowane w windows-1250, a Linux sobie radzi z literami zakodowanymi w iso-8859-2. UTF-8 nie działa nigdzie...

Jeśli ktoś wie jak w miarę uniwersalnie napisać takie sortowanie, to niech się swoją wiedzą podzieli ;]
zimi
co tu dużo gadać: usort" title="Zobacz w manualu PHP" target="_manual i napisać funkcję porównującą...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.