Autor Zpráva
Iuau8
Profil *
Natrafil som na dost zavazny problem, preco na:

strlen('čččččččččč')
vrati 20, a nie 10 ako je to napisane?

Da sa to nejako osetrit?

Dakujem
Joker
Profil
Iuau8
Tipnu: UTF-8?
Možná by pomohlo mb_strlen
Alphard
Profil
zkuste mb_strlen()

// půl minuty, to je zase den :-)
Iuau8
Profil *
Ano, UTF-8 :o)

1.) A to teraz mam akoze vsetky strlen nahradit mb_strlen?
2.) A ked nieco nebude v UTF-8, tak mb_strlen bude fungovat spravne?

Dakujem.
Alphard
Profil
ano, na stránce http://cz2.php.net/manual/en/book.mbstring.php jsou vypsané ještě další funkce

nahraďte všechny a mělo by to fungovat nejen v utf-8 ale i jiných kódováních (tím myslím naše, o čínská se nezajímám :-))
peta
Profil
Iuau8
strlen('čččččččččč')
vrati 20, pokud mas soubor nastaveny na kodovani utf8, protoze znaky mimo US Ascii se pocitaji za 2. Cili ten udaj je naprosto spravny, presne tak je to zapsane v tom souboru, jako 2 znaky. Si ten soubor otevri v poznamkovem bloku windows. V kodovani win-1250 zobrazi utf jako 2 znaky.

'A ked nieco nebude v UTF-8'
V tom pripade by melo str_len i mb_strlen vracet stejne hodnoty?
Nebo musis vedet v jakem je to kodovani. :)
Kwaczek
Profil *
<?
$a = strlen(utf8_decode('čččččččččč'));
echo $a;
?>
imploder
Profil
Iuau8:
2.) A ked nieco nebude v UTF-8, tak mb_strlen bude fungovat spravne?
Pokud ten řetězec nebude obsahovat znaky s diakritikou (tj. budou tam jen bajty s hodnotou <=127), určí i mb_strlen() jeho délku správně. V takovém případě bude platit (počet znaků == počet bajtů). Znaky 0-127 jsou ve všech kódováních i v UTF-8 stejné. U řetězce s diakritikou např. v Latin2 nebo cp1250 by se délka pomocí mb_strlen() správně určit nemusela. Vždycky je dobré znát kódování, bez toho se asi neobejdeš, už jen proto, abys mohl text správně zobrazit.

Na u delších textů spolehlivou detekci se dá použít dgxova autodetekce AutoCzech:
http://latrine.dgx.cz/autoczech-aneb-automaticka-detekce-kodovani
Joker
Profil
ještě poznámka ad peta:
vrati 20, pokud mas soubor nastaveny na kodovani utf8, protoze znaky mimo US Ascii se pocitaji za 2. Cili ten udaj je naprosto spravny, presne tak je to zapsane v tom souboru, jako 2 znaky.
A proto je UTF-8 vhodné kódování pro semestrálky, diplomky... prostě všude, kde musíte splnit nějaký objem textu. Když třeba 10 normostran českého textu uložíte do UTF-8, může z toho (v závislosti na množství diakritiky) vyjít třeba 12, v extrémním případě až 20 normostran!
Ne, samozřejmě je to nesmysl, peta se akorát svým originálním způsobem pokusil říct, že v UTF-8 může jeden znak zabírat i víc než jeden bajt a strlen vrací, kolik ten řetězec má bajtů, což ale v UTF-8 může být více, než kolik ten řetězec má skutečně znaků.

'A ked nieco nebude v UTF-8'
V tom pripade by melo str_len i mb_strlen vracet stejne hodnoty?
Nebo musis vedet v jakem je to kodovani. :)
Achjo. Mám dojem (už delší dobu), že peta by si měl na monitor přilepit lísteček: "Když nevím odpověď na otázku, nebudu alespoň psát nesmysly!"

Iuau8:
2.) A ked nieco nebude v UTF-8, tak mb_strlen bude fungovat spravne?
Správná odpověď na tuhle otázku tu koukám ještě není, takže:
Funkce mb_strlen má jako vstupní parametr v jakém je řetězec kódování, tedy funguje i s jiným kódováním než UTF-8, akorát jí musíte říct, v jakém je řetězec kódování.
Znát (nebo nějak zjistit) kódování řetězce je nezbytné, protože u řetězce v neznámém kódování nelze určit počet znaků (když nevíte kolik bajtů odpovídá jakému znaku).
Viz také manuál: http://php.net/manual/en/function.mb-strlen.php

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: