Autor Zpráva
grimword
Profil
Pokud použiji funkci substr($neco, 0, 10) a funkci mb_substr($neco, 0, 10) - dostanu vždy stejně dlouhý řetězec? Pokud se v textu bude vyskytovat diakritika, změní se něco? Nebo za všech okolností vždy bude výsledek u obou stejně dlouhý? (bez ohledu na problémy s kódování)
juriad
Profil
Délka se bude lišit (pokud je soubor uložen v nějakém vícebytovém kódování; typicky UTF-8).
<?php
$text = "Bacoл ïpѕúm Ꮷ߀ɭor ѕit áϻet occäëcât bêef qùïѕ հɑmƅúrɢêr ѵêԉïs߀ԉ t-bònê. Pròѕcíûttò pìg äԉìϻ aԉᏧoùíllè pr߀ïԁéлt kevïл jêrkϒ incídìdúԉt cɦûcƙ. Fɑtƃɑck ϳérkϒ t-b߀лé, sհòrt ríƅѕ ρorchèttã";

echo substr($text, 1, 49); # počet bytů
echo "\n";
echo mb_substr($text, 1, 49, 'UTF-8'); # počet znaků
echo "\n";

vypíše (všimni si toho zničeného á):
acoл ïpѕúm Ꮷ߀ɭor ѕit �
acoл ïpѕúm Ꮷ߀ɭor ѕit áϻet occäëcât bêef qùïѕ հɑmƅ
grimword
Profil
Přesně problémy typu "zničeného á" mám, proto to řeším.

Lze tedy vyvodit nějaké pravidlo? Například když chci 10 znaků:
- u substr() použiji substr(..., 0, 20)
- u mb_substr() použiji mb_substr(..., 0, 10)

Používám UTF-8 a texty mám s diakritikou.
Radek9
Profil
grimword:
Znak v UTF-8 může mít například i 4 byty, takže používej druhé řešení. MB knihovna je snad dnes už všude.
juriad
Profil
Ne. V kódování UTF-8 je každý znak jinak dlouhý. Může mít 1 - 4 byty. To, jak dlouhý je závisí na konkrétním znaku. Pokud bys dostal na vstupu čínský znak, tak ten bude většinou mít 3 byty. Znak s diakritikou bude mít 2 byty. Obyčejný znak jako je třeba a^2/, zabírá jediný byte.
Joker
Profil
grimword:
substr vrací zadaný počet bajtů.
mb_substr je multibyte-safe a vrací zadaný počet znaků.

Čili pro počet znaků v UTF-8 je správná mb_substr.

Lze tedy vyvodit nějaké pravidlo?
Ano: Když mám utf-8 a chci pracovat s počtem znaků, použiji mb_* funkce.
grimword
Profil
Pokud jsem doposud používal substr($text, 0, 140), tak ve výsledku každý zkrácený text byl jinak dlouhý? A pokud nyní přejdu na mb_substr(), tak budu mít všechny texty stejně dlouhé? Chápu správně?
Radek9
Profil
grimword:
Ano. A měl jsi je nejen jinak dlouhé, ale třeba i s rozseklým znakem.
anonymníí
Profil *
grimword:
Pokud jsem doposud používal substr($text, 0, 140), tak ve výsledku každý zkrácený text byl jinak dlouhý?
Ano, v českém prostředí byl dlouhý (140 - počet diakritických znaků) znaků. Pokud byl poslední znk diakritický a na pomezí 140 a 141 bytu, rozbil se.

tak budu mít všechny texty stejně dlouhé?
Ano, ale delší než teď. 140 znaků.
grimword
Profil
Perfektní, děkuji za odpovědi.
juriad
Profil
To jak byl doposud dlouhý záleželo na počtu znaků s diakritikou, které obsahoval. V tom mém šíleném příkaldu je je rozdíl asi polovina textu.
U mb_substr bude každý zkrácený text obsahovat stejný počet znaků (pokud nebyl příliš krátký a tedy neobsahoval dostatek znaků).

V HTML se z hlediska použitých fontů nejspíše bude jevit jinak dlouhý, protože texty iiiii a mmmmm, oba obsahují 5 znaků, ale znak m je mnohem širší než i.
Pokud ti tedy jde o zkrácení textu, aby se vešel do nějakého bloku...

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0