Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] str_replace i polskie znaki
Forum PHP.pl > Forum > Przedszkole
statek
Nie wiem czemu ale funkcja str_replace nie działa mi dobrze z polskimi znakami. Mam łańcuch znaków wpisany w kodzie php (edytor ma kodowanie utf-8), następnie zamieniam w tym łańcuchu znaki diakrytyczne na ich odpowiedniki w ascii: '±' na 'a', 'ć' na 'c' i tak dalej. I na stronie dostaje same znaki zapytania w miejsce polskich liter. Kodowanie strony jest utf-8 i teksty wpisane w htmlu s± poprawnie wy¶wietlane. Co zrobić?
drake88
Kod
$cenzura = array('±', 'ć', 'ł', 'ó', '¶', ' ', 'ę', 'ń', 'ż', 'Ą' );
$zamiana = array('a', 'c', 'l', 'o', 's', '_', 'e', 'n', 'z', 'z' );


Spróbuj tak.
skowron-line
lub
  1. <?php
  2. strtr($str,"ˇĆĘŁŃӦݬ±ćęłń󶿼","ACELNOSZZacelnoszz");
  3. ?>
statek
Dzięki za odpowiedzi.
miałem co¶ takiego:
$cenzura = array('±', 'ć', 'ł', 'ó', '¶', ' ', 'ę', 'ń', 'ż', 'Ľ' );
$zamiana = array('a', 'c', 'l', 'o', 's', '_', 'e', 'n', 'z', 'z' );
$a=str_replace( $cenzura, $zamiana, $a);
czemu to nie działało? Dlaczego tak jest?

<?php
strtr($str,"ˇĆĘŁŃӦݬ±ćęłń󶿼","ACELNOSZZacelnoszz");
?>
to działa, a poprzednie nie.
Nic z tego nie rozumiem.
athei
strtr nie działa dla UTF8 (dokument zapisany w utf8, oraz charset utf-8), dla iso-8859-2 owszem.
SprawdĽ $tekst = "Zażółć gę¶l± jaĽń";

Działa natomiast str_replace.
  1. <?php
  2. function clearDiacritics($sText)
  3. {
  4.  $aReplacePL = array('±' => 'a', 'ę' => 'e', '¶' => 's', 'ć' => 'c', 'ó' => 'o', 'ń' => 'n', 'ż' => 'z', 'Ľ' => 'z', 'ł' => 'l', 'ˇ' => 'A', 'Ę' => 'E', '¦' => 'S', 'Ć' => 'C', 'Ó' => 'O', 'Ń' => 'N', 'Ż' => 'Z', '¬' => 'Z', 'Ł' => 'L');
  5.  return str_replace(array_keys($aReplacePL), array_values($aReplacePL), $sText);
  6. }
  7. echo clearDiacritics($tekst);
  8. ?>
statek
athei masz rację, omyłkowo sprawdzałem działanie strtr dla kodowania iso.
Ale dlaczego str_replace nie zadziałał w postaci w jakiej go podałem? Co zrobiłem Ľle? Czemu wy¶wietlał znaki zapytania zamiast odpowiedników ascii dla polskich liter? Proszę wytłumacz mi to, bo nie daje mi to spokoju. Od czego to zależy?

widzę, że indeksy w $aReplacePL zawieraj± ±ęć¶ - polskie znaki diakrytyczne. Czy indeksy tablic asocjacyjnych nie musz± być ascii?

Pozdrawiam.
athei
1.Nie wiem jak użyłe¶ swój kod, ale mi działa
  1. <?php
  2. $a = 'Zażółć gę¶l± jaĽń';
  3. $cenzura = array('±', 'ć', 'ł', 'ó', '¶', ' ', 'ę', 'ń', 'ż', 'Ľ' );
  4. $zamiana = array('a', 'c', 'l', 'o', 's', '_', 'e', 'n', 'z', 'z' );
  5. $a=str_replace( $cenzura, $zamiana, $a);
  6. echo $a; // Zazolc_gesla_jazn
  7. ?>

2. nie
statek
athei już się chyba wyja¶niło, wcze¶niej przed str_replace użyłem strtolower. I wła¶nie ta funkcja namieszała. Po jej wycięciu jest ok - musiałem dopisać zamiany dla wielkich liter i dopiero potem zamiana na małe literki. Czemu strtolower tak brzydko się zachowuje? W manualu znalazłem: Note that 'alphabetic' is determined by the current locale. Czyli pewnie gdzie¶ w konfiguracyjnym pliku mogę przestawić na polski alfabet, ale to czyni skrypt/stronę zupełnie nie przeno¶n± - nie zawszę będę miał dostęp do konfiguracji php. Czy da się zmienić ten "local" i w ogóle domy¶lne kodowanie zawsze i wszędzie na utf-8 z poziomu skryptu php?
athei
strtolower nie działa dla UTF8 tak samo jak np. ( strlen, strpos, strrpos, substr, strtoupper, ord, chr) i wiele innych.
mb_strtolower natomiast działa.
statek
athei nie wiedziałem o tym sad.gif Teraz zaczynam sobie przypominać pewne trudno¶ci i to jak musiałem na około je rozwi±zywać, teraz wiem, że to ze względu na ten brak wsparcia dla utf-8. Szczerze mówi±c, to fatalna wiadomo¶ć, mam nadzieje, że w przyszłych wersjach PHP będzie to poprawione.

Pozdrawiam.
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.