Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Problem z substr
maro123
post
Post #1





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 24.08.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
maro123
post
Post #2





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 24.08.2009

Ostrzeżenie: (0%)
-----


Nie bardzo rozumie, tekst mam w $tekst. Kod wyglada tak: substr($tekst, 0, 128)
Go to the top of the page
+Quote Post
Pawel_W
post
Post #3





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

Ostrzeżenie: (0%)
-----


zapewne problem nie z substr, a kodowaniem winksmiley.jpg

iconv
Go to the top of the page
+Quote Post
Fifi209
post
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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?


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
maro123
post
Post #5





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 24.08.2009

Ostrzeżenie: (0%)
-----


Kodowanie jest ok, wszystkie polskie znaki sie wyswietlaja tylko jezeli ten 128my znak to znak polski to wtedy zamiast niego wyswietla sie �.
Go to the top of the page
+Quote Post
flashdev
post
Post #6





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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


--------------------
Go to the top of the page
+Quote Post
maro123
post
Post #7





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 24.08.2009

Ostrzeżenie: (0%)
-----


To samo jest.
Go to the top of the page
+Quote Post
marq3d
post
Post #8





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.05.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
flashdev
post
Post #9





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.


--------------------
Go to the top of the page
+Quote Post
maro123
post
Post #10





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 24.08.2009

Ostrzeżenie: (0%)
-----


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 ć.
Go to the top of the page
+Quote Post
flashdev
post
Post #11





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.

Ten post edytował flashdev 26.08.2009, 14:08:06


--------------------
Go to the top of the page
+Quote Post
ucho
post
Post #12





Grupa: Zarejestrowani
Postów: 300
Pomógł: 32
Dołączył: 31.07.2006

Ostrzeżenie: (0%)
-----


flashdev udzielił prawidłowej i wyczerpującej odpowiedzi, może zamiast szukać dziury w całym zastosujesz się do jego rady?
Go to the top of the page
+Quote Post
maro123
post
Post #13





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 24.08.2009

Ostrzeżenie: (0%)
-----


@flashdev, Zdziwiony smile.gif jednak miales racje, przepraszam za zamieszanie. Bez tego , 'utf-8' mb_substr zachowuje sie jak substr.
Temat do zamknięcia.

Ten post edytował maro123 26.08.2009, 14:16:38
Go to the top of the page
+Quote Post
thek
post
Post #14





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 05:41