Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] str_replace i polskie znaki
statek
post 13.07.2009, 14:49:08
Post #1





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 2.06.2009

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


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ć?
Go to the top of the page
+Quote Post
drake88
post 13.07.2009, 14:53:46
Post #2





Grupa: Zarejestrowani
Postów: 283
Pomógł: 15
Dołączył: 22.03.2009
Skąd: Bytów

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


Kod
$cenzura = array('±', 'ć', 'ł', 'ó', '¶', ' ', 'ę', 'ń', 'ż', 'Ľ' );
$zamiana = array('a', 'c', 'l', 'o', 's', '_', 'e', 'n', 'z', 'z' );


Spróbuj tak.


--------------------
Go to the top of the page
+Quote Post
skowron-line
post 13.07.2009, 15:00:53
Post #3





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


lub
  1. <?php
  2. strtr($str,"ĄĆĘŁŃÓŚŻŹąćęłńóśżź","ACELNOSZZacelnoszz");
  3. ?>


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
statek
post 13.07.2009, 17:09:38
Post #4





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 2.06.2009

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


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.
Go to the top of the page
+Quote Post
athei
post 13.07.2009, 19:07:35
Post #5





Grupa: Zarejestrowani
Postów: 389
Pomógł: 141
Dołączył: 11.04.2009

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


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


Ten post edytował athei 13.07.2009, 19:32:52
Go to the top of the page
+Quote Post
statek
post 13.07.2009, 19:18:30
Post #6





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 2.06.2009

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


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.
Go to the top of the page
+Quote Post
athei
post 13.07.2009, 19:32:24
Post #7





Grupa: Zarejestrowani
Postów: 389
Pomógł: 141
Dołączył: 11.04.2009

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


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
Go to the top of the page
+Quote Post
statek
post 13.07.2009, 19:50:32
Post #8





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 2.06.2009

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


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?
Go to the top of the page
+Quote Post
athei
post 13.07.2009, 20:00:07
Post #9





Grupa: Zarejestrowani
Postów: 389
Pomógł: 141
Dołączył: 11.04.2009

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


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.
Go to the top of the page
+Quote Post
statek
post 13.07.2009, 20:29:23
Post #10





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 2.06.2009

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


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.
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 Wersja Lo-Fi Aktualny czas: 19.04.2024 - 12:17