Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]substr() nie poprawnie liczy znaki
Forum PHP.pl > Forum > Przedszkole
miras
Witam, mam pewien problem z funkcją substr(), a mianowicie źle mi zlicza znaki...
jak jest przedział od 0 do 900 znaków to wyświetla mi ok. 890 znaków, ale gdy jest przedział od 900 do 1800 znaków to już wyświetla mi ok. 1500znaków, o co chodzi?
jeśli to coś komuś pomoże to wklejam kod mojej funkcji, ogólnie funkcja w pewnej części odpowiada za paginację.





  1. public function article_pagination($content) {
  2. $this->od=0;
  3. for ($i=0; $i<strlen($content)/900; $i++) {
  4. $this->number = $this->number+900;
  5. $this->ret=$this->ret.'<div id="pop'.$i.'" '.$this->display.'>'.mb_substr($content, $this->od, $this->number, utf8).' . . .</div>';
  6. $this->display='style="display: none;"';
  7. $this->od = $this->od+900;
  8. }
  9. return $this->ret;
  10. }
sajegib
Proponuję spróbować użyć mb_substr(); - niektóre znaki ( w tym polskie z ogonkami ) składają się z więcej niż jednego bajta, dlatego w ich wypadku należy używać funkcji z 'rodziny' mb_ czyli MULTIBYTE
pozdrawiam
miras
tzn, próbowałem tego i tego (patrz kod tam jest mb_substr) i dalej liczy jakoś dziwnie..

jakaś parodia normalnie..

to
  1. strlen(substr($content,900,1800));


zwraca mi 1531
vermis
użyj mb_substr() oraz mb_strlen(). Ustaw odpowiednie kodowanie stringów. Jak nie będzie działać to wklej kod.
Strlen liczy bajty a nie znaki w manulu jest to wyraźnie zaznaczone w sekcji 'notes'.
miras
nic to nie dało... kod:

  1. public function article_pagination($content) {
  2. $this->od=0;
  3. for ($i=0; $i<ceil(mb_strlen($content)/900); $i++) {
  4. $this->number = $this->number+900;
  5. $this->ret=$this->ret.'<div id="pop'.$i.'" '.$this->display.'>'.mb_substr($content,$this->od,$this->number, utf8).' . . .</div>';
  6. $this->display='style="display: none;"';
  7. $this->od = $this->od+900;
  8. }
  9. return $this->ret;
  10. }
mateusz.jarzewski
Cytat(sajegib @ 11.11.2013, 13:31:03 ) *
Proponuję spróbować użyć mb_substr(); - niektóre znaki ( w tym polskie z ogonkami ) składają się z więcej niż jednego bajta, dlatego w ich wypadku należy używać funkcji z 'rodziny' mb_ czyli MULTIBYTE
pozdrawiam

To zależy w jakim kodowaniu. W UTF-8, owszem, polskie znaki są zapisywanie w dwóch bajtach, natomiast w ISO-8859-2 w jednym.
miras
Dodam od siebie, żebyście się nie spierali niepotrzebnie, że w moim testowym tekście, który wyświetlam z bazy nie ma polskich znaków.
Turson
Jaki masz format kodowania pliku?
miras
utf-8
mateusz.jarzewski
Osoboście nie widze opcji żeby kod:
  1. strlen(substr($content,900,1800));

zwrócił liczbę większą niż 900.
Natomiast zdebugowanie tego to prościzna, należy zacząć od zapisania $content do pliku, po serializacji.
com
http://ideone.com/vZkohp

Masz dłuższy/krótszy tekst niż obcinasz to co sie dziwisz ze źle liczy wink.gif
miras
no bo mam dłuższy tekst, a to w czymś przeszkadza ? chyba jak mam tekst 5000 znaków to substr($cont, 900, 1800) powinno mi zwrócić ciąg 900 znakowy, nie mam racji?
mateusz.jarzewski
Nie masz. Powinno zwrócić ciąg od 0 do 900 znaków i to tylko w przypadku gdy argument jest typu string/
miras
aaaa, no to powiedz jeszcze proszę czym mogę wyświetlić znaki od 900 do 1800 ?
com
no tym czym wyświetlasz tylko ich nie policzysz w ten sposób, bo on Ci obetnie do 1800 i doda reszte która została dlatego wychodza potem inne liczby niż 900.. Myście to nie jest takie trudne exclamation.gif

mateusz.jarzewsk... kompletnie Che nie zroumiałem, w php wszystko co nie jest tablicą lub obiektem jest stringiem wink.gif no chyba, że rzutujesz na typ ale tekstu nie rzutujesz na nic przecież...
miras
Nic mi nie podpowiadają Twoje podpowiedzi.. "Myślcie" a co ja do cholery robie od kilku godzin?!
mateusz.jarzewski
Cytat(com @ 11.11.2013, 18:11:54 ) *
mateusz.jarzewsk... kompletnie Che nie zroumiałem, w php wszystko co nie jest tablicą lub obiektem jest stringiem wink.gif no chyba, że rzutujesz na typ ale tekstu nie rzutujesz na nic przecież...

Mylisz się. Jest jeszcze int i float.
miras
Pomoże mi ktoś ?
com
Cytat(mateusz.jarzewski @ 11.11.2013, 18:55:33 ) *
Mylisz się. Jest jeszcze int i float.


Kolejny wielki znawca powiedziałem już jak coś rzutujesz to jest int itd, ale normalnie jest traktowane jakby było stringiem, wiec mi nie wmawiaj, że sie myle tylko poczytaj, dlatego używa sie === zamiast == i tak samo !== zamiast != wink.gif

miras powiedz mi co ty chcesz uzyskać?
miras
mam ciąg znaków $content, muszę go podzielić na mniejsze 900 znakowe ciągi.
com
nastepnym razem czytaj dobrze manuala, a nie wybiurczo wink.gif
http://ideone.com/vZkohp

drugi parametr to ilosc znaków a nie koniec wink.gif
mateusz.jarzewski
Cytat(com @ 11.11.2013, 19:03:16 ) *
Kolejny wielki znawca powiedziałem już jak coś rzutujesz to jest int itd, ale normalnie jest traktowane jakby było stringiem, wiec mi nie wmawiaj, że sie myle tylko poczytaj, dlatego używa sie === zamiast == i tak samo !== zamiast != wink.gif


Niesety, po raz kolejny nie masz racji.
W PHP mamy następujące typy danych:
Bool, Int, Float, String, Array, Object, Resource, NULL oraz Callback
A rzutować można na:
Bool, Int, Float, String, Array, Object oraz NULL

Źródła:
http://php.net/manual/pl/language.types.php
http://www.php.net/manual/pl/language.type...pe-juggling.php
com
Dobra bo mówimy zupełnie o czymś innym:
http://us.php.net/manual/en/language.types....string.casting
wink.gif

A to co piszesz nie ma wgl związku z tematem bo autor miał teksty a nie w zmiennej liczbe...

Przykład praktyczny:
http://ideone.com/UHLqn9

ale ok mogłeś mnie nie zrozumieć bo nie do końca to jasno napisałem smile.gif

Cytat
ale normalnie jest traktowane jakby było stringiem

To faktycznie troche źle napisałem, bo zachodzi tam domyślna konwersja na zadany typ, ale chodziło mi o to że w ten sposób jak porównamy ze stringiem to ten string też zostanie zrzutowany do danego typu co tak naprawde jest przekłamaniem bo "1" i 1 to nie jest to samo smile.gif
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.