Autor Zpráva
gaminn
Profil *
Zdravím,
mám problém s českým seřazením pole, nepomáhá ani různé nastavení setlocale() (locale se sice nastaví (zjistím pomocí localeconv()), ale nemá vliv na řazení), echo 'č'>'e'?1:0; stále vypisuje 1, pole se vždy seřadí tak, že položky začinající na písmeno s diakritikou jsou na konci seznamu. Používám kódování UTF-8, ale řazení nefunguje ani ve WIN-1250. Mám PHP 5.1, Apache 2 a Win XP.

Nevěděl by si někdo rady?
mila
Profil
Php všeobecně nezvládá utf8 (obecně multibyte kódování).
Hledej mb string.
anode
Profil
Pro porovnání dvou řetězců podle locale použij funkci strcoll(). Nezkoušel jsem ji, ale měla by pracovat...
No a jakmile budeš umět správně porovnat dva řetězce, sestavíš si funkci pro řazení a funkcí usort() seřadíš.
gaminn
Profil *
Bohužel ani tato funkce není všemohoucí, konkrétně řadím státy světa a dostávám výsledky např:

Array ( [0] => Arménie [1] => Čína [2] => Austrálie )

- Č a Í se řadí mezi státy začínající na A + další nesrovnalosti

echo strcoll('Č', 'Au'); vrací -1
echo strcoll('Č', 'A'); vrací 1


Nebo dělám něco špatně?
gaminn
Profil *
Udělal jsem si takovouto funkci:

function mb_strcoll($string1, $string2)
{
return strcoll(iconv('UTF-8', 'WINDOWS-1250', $string1), iconv('UTF-8', 'WINDOWS-1250', $string2));
}

, která již celkem funguje, bohužel ale nastal ale další problém.

Pokud se v řetězci $string1 nebo $string1 objeví písmeno Å, vyskočí notice:

Notice: iconv() [function.iconv]: Detected an illegal character in input string in xxx on line xxx

To si opravdu iconv neumí poradit s některými písmeny? (možná to patří do nového threadu, ale snad mi bude zodpovězeno;))
gaminn
Profil *
Tím písmenem Å je myšleno A s kroužkem.
gaminn
Profil *
Problém s neobvyklými písmeny celkem vyřeší aliterace:

function mb_strcoll($string1, $string2)
{
return strcoll(iconv('UTF-8', 'WINDOWS-1250//TRANSLIT', $string1), iconv('UTF-8', 'WINDOWS-1250//TRANSLIT', $string2));
}

Např. moje A s kroužkem je pak konvertováno na obyčejné A.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0