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 |
#4 · Zasláno: 25. 4. 2014, 10:07:49
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 |
#5 · Zasláno: 25. 4. 2014, 10:11:18
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 |
#7 · Zasláno: 25. 4. 2014, 10:16:14
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 |
#8 · Zasláno: 25. 4. 2014, 10:17:30
grimword:
Ano. A měl jsi je nejen jinak dlouhé, ale třeba i s rozseklým znakem. |
||
anonymníí Profil * |
#9 · Zasláno: 25. 4. 2014, 10:20:48
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 |
#10 · Zasláno: 25. 4. 2014, 10:20:49
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 mm>mm>m, 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... |
||
Časová prodleva: 10 let
|
0