Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z substr
Forum PHP.pl > Forum > Przedszkole
maro123
Witam, mam problem z substr, wyciagam z tekstu pierwsze 128 znakow wlasnie przez substr lecz gdy ostatnim znakiem w ciagu jest ąćśęół itp to na końcu wyświetla mi się takie cos: �. Jak to mozna obejsc ? moze jest inny sposob na wyciagniecie X pierwszych znakow z ciagu ?

Pozdrawiam
maro123
Nie bardzo rozumie, tekst mam w $tekst. Kod wyglada tak: substr($tekst, 0, 128)
Pawel_W
zapewne problem nie z substr, a kodowaniem winksmiley.jpg

iconv
Fifi209
Sorki, nie wiem czemu pomyślałem o odczycie z pliku...

Kodowanie w pliku masz na pewno dobre? Może nie wysyłasz nagłówka do przeglądarki o kodowaniu?
maro123
Kodowanie jest ok, wszystkie polskie znaki sie wyswietlaja tylko jezeli ten 128my znak to znak polski to wtedy zamiast niego wyswietla sie �.
flashdev
Cytat(maro123 @ 26.08.2009, 13:54:44 ) *
Witam, mam problem z substr, wyciagam z tekstu pierwsze 128 znakow wlasnie przez substr lecz gdy ostatnim znakiem w ciagu jest ąćśęół itp to na końcu wyświetla mi się takie cos: �. Jak to mozna obejsc ? moze jest inny sposob na wyciagniecie X pierwszych znakow z ciagu ?

Pozdrawiam


multibyte substring -> mb_substr
maro123
To samo jest.
marq3d
zdaje się ze można iterować:

  1.  
  2. $text = '.....';
  3. $text2 = '';
  4. for($i=0; $i<128; $i++){
  5. $text2.=$tekst{$i};
  6. }
  7.  


czytałem gdzieś kiedyś ale nigdy nie testowałem
flashdev
Cytat(marq3d @ 26.08.2009, 14:45:05 ) *
zdaje się ze można iterować:

  1.  
  2. $text = '.....';
  3. $text2 = '';
  4. for($i=0; $i<128; $i++){
  5. $text2.=$tekst{$i};
  6. }
  7.  


czytałem gdzieś kiedyś ale nigdy nie testowałem


Ale to i tak nic nie da, bo to wyciąga pojedyńcze bajty ze stringu.

A znaki taki jak ą, ę, ć składają się z dóch bajtów.

Użycie mb_string oraz wybór prawidłowego kodowania musi przynieść oczekiwany rezultat.
Ale oczywiście wygodniej jest napisać, że to samo jest i czekać na gotowe rozwiązanie z przykładem.
maro123
Ale co tu ma kodowanie skoro to wyglada tak: [...]teraźniejszoś�. Jakby zalezalo od kodowanie to by w tym wyrazie nie bylo ani ź ani ś tylko wszystkie polskie znaki posypalby sie, nie byloby tak ?. To � to dokladnie 128znak, zamiast tego powinno byc ć.
flashdev
Cytat(maro123 @ 26.08.2009, 14:58:46 ) *
Ale co tu ma kodowanie skoro to wyglada tak: [...]teraźniejszoś�. Jakby zalezalo od kodowanie to by w tym wyrazie nie bylo ani ź ani ś tylko wszystkie polskie znaki posypalby sie, nie byloby tak ?. To � to dokladnie 128znak, zamiast tego powinno byc ć.


  1. $str = 'teraźniejszość';
  2. echo strlen($str); // 17
  3. echo mb_strlen($str); // 17
  4. echo mb_strlen($str, 'utf-8'); // 14
  5.  
  6. $str2 = 'ąśćęabcd';
  7. echo substr($str2, 0, 5); // ąś�
  8. echo mb_substr($str2, 0, 5, 'utf-8'); // ąśćęa


zdziwiony?

Edit:

� - ten znaczek, to nic innego jak połowa polskiego znaku.
ucho
flashdev udzielił prawidłowej i wyczerpującej odpowiedzi, może zamiast szukać dziury w całym zastosujesz się do jego rady?
maro123
@flashdev, Zdziwiony smile.gif jednak miales racje, przepraszam za zamieszanie. Bez tego , 'utf-8' mb_substr zachowuje sie jak substr.
Temat do zamknięcia.
thek
Problemem jest funkcja substr. Polskie znaki diakrytyczne są przechowywane nie na 1 (jak większość) ale 2 bajtach. Powoduje to zamieszanie gdy masz choćby słowo: gęśla (1-2-2-1-1), co daje 7 bajtów zamiast 5. Nie jest to także zamieniane na 10 bajtów dla równości (5x2 bajty) Stąd przy używaniu substr w polskich znakach jest bajzel. flashdev udzielił odpowiedzi jak to rozwiązać i na chwilę obecną nie ma skuteczniejszej metody - tylko mb_substr. Szkoda tylko, że jest wolniejsza zazwyczaj, co nie ucieszy miłośników zwiększania wydajności.
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.