Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] porównanie polskich liter
Forum PHP.pl > Forum > Przedszkole
klinski
Witam,

Czy może ktoś z was się spotkał z taką dziwną sytuacją że porównanie dwóch znaków (polskich liter) nie działa?

  1. <?php
  2. $string = "jakiś znak ń coś tam";
  3. for ($i=0;$i<strlen($string);$i++)
  4. {
  5.   if ($string[$i]=="ń")
  6.       echo "Podany ciąg znaków zawiera ń";
  7. }
  8. ?>


Powyższy przykład zapisuje wpliku z kodowanie UTF-8 i z takim też wyświetlam w przeglądarce ale nie działa.
Quider
Spróbuj pozamieniać poszczególne znaki w locie na numerki z tablic ASCII. tedy porównanie powinno działać bez przeszkód.

Szczerze mówiąc nigdy nie robiłem czegoś takiego pod PHP ale w Pascalu działa.
piotrooo89
nie bardzo wiem po co tak kombinować.

  1. <?php
  2. $string = "jakiś znak ń coś tam";
  3. $sz = 'ń';
  4.  
  5. $find = strpos($string, $sz);
  6.  
  7. if ($find == true)
  8.    echo 'jest ń';
  9. ?>
klinski
Może napiszę dokładnie co chce zrobić. Chciałbym na stronie ciąg znaków zamienić na napis graficzny.

  1. <?php
  2. $alfabet = array('a','ą','b','c','ć','d','e','ę','f','g','h','i','j','k','l','ł','m','n','ń','o','ó','q','p','r','s','ś','t','u','w','y','z','ź','ż','-',',','.',' ');
  3.  
  4. $txt = "jakiś znak ń coś tam";
  5.                    
  6. for ($i=0;$i<strlen($txt);$i++)
  7. {        
  8.   foreach($alfabet as $key=>$value)
  9.  {                
  10.     if ($value==$txt[$i])
  11.     {
  12.    echo "<img src=\"alfabet/".($key+1).".jpg\">";
  13.     }    
  14.  }
  15. }
  16. ?>


Wszystko działa tak jak chce tylko jest problem z polskimi znakami.
ucho
Takie rzeczy tylko w php6. W żadnej wcześniejszej wersji warunek
  1. <?php
  2. $string[$i]=="ń"
  3. ?>

Nie będzie _nigdy_ spełniony bo porównujesz 1 bajt z kilkoma. Strpos za to zadziała poprawnie nawet nie wiedząc o istnieniu utf8 - po prostu będzie szukał grupy bajtów. Więc jaka jest różnica pomiędzy strpos a mb_strpos? To pierwsze poda znaleziony indeks jako numer bajtu - to drugie jako numer znaku. Ale już stripos nie zadziała poprawnie w przypadku kodowania utf8 - ignorowanie wielkości znaków wymaga zrozumienia tego co się przetwarza.
klinski
Rozumiem. Zacząłem kombinować z strpos ale niestety nadal nic.

  1. <?php
  2. $string = "jakiś znak ń coś tam";
  3. $char = "ń";
  4. $s = "ń";
  5.  
  6. //działa
  7. if (strpos("_".$char, $s))
  8.   echo 'jest '.$s;
  9.  
  10. echo "<br /><br />";
  11.  
  12. //nie działa
  13. for ($i=0;$i<strlen($string);$i++)
  14. {
  15.  if (strpos("_".$string[$i],$s))
  16.      echo "Podany ciąg znaków zawiera ".$s;
  17. }
  18. ?>




Czy jest możliwe zrobienie tego w php5 o czym pisałem w poprzednim poscie?
pyro
użyj str_split() do prawdiłowego rozbicia ciągu.
klinski
To samo. Ale zauważyłem jeszcze jedną rzecz której nie rozumię. Przy wyświetlaniu rozbitego ciągu na tablice i przy wyświetlaniu po każdym znaku <br /> zamiast polkich liter są kwadraty. Bez znaku <br /> jest ok.

  1. <?php
  2. $string = "jakiś znak ń coś tam";
  3. $char = "ń";
  4. $s = "ń";
  5.  
  6. if (strpos("_".$char, $s))
  7.   echo 'jest '.$s;
  8.  
  9. echo "<br /><br />";
  10.  
  11. foreach (str_split($string) as $v)
  12. {    
  13.    echo $v;
  14.    //echo "<br />"; //jezeli dodam ta linijke to zamiast polskich liter robią się kwadraty.
  15.  if (strpos("_".$v,$s))
  16.      echo "Podany ciąg znaków zawiera ".$s;    
  17. }
  18. ?>


Po wykonaniu print_r(str_split($string)) zamiast polskich znaków są krzaki;

  1. <?php
  2. (
  3.    [0] => j
  4.    [1] => a
  5.    [2] => k
  6.    [3] => i
  7.    [4] => &#65533;
  8.    [5] => &#65533;
  9.    [6] =>  
  10.    [7] => z
  11.    [8] => n
  12.    [9] => a
  13.    [10] => k
  14.    [11] =>  
  15.    [12] => &#65533;
  16.    [13] => &#65533;
  17.    [14] =>  
  18.    [15] => c
  19.    [16] => o
  20.    [17] => &#65533;
  21.    [18] => &#65533;
  22.    [19] =>  
  23.    [20] => t
  24.    [21] => a
  25.    [22] => m
  26. )
  27. ?>
ucho
http://at.php.net/manual/en/function.str-split.php#69331 mb_str_split
Komentarze to zawsze najważniejsza część manuala
klinski
Wielkie dzięki za pomoc, nareszcie mi się udało. Powodem tego że nie działało było to używałem kodowania utf-8 w pliku. Kiedy przed operacjami na stringach przekonwertowałem je na ISO za pomocą iconv zadziałało.
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.