Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Operacje na stringu a kodowanie
Altrix
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 18.10.2010

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


Dziwna sprawa. Mam tekst w którym chce pozamieniać znaki szyfrem Cezara (czyli zamienić znak na 3 po nim w przygotowanej liście znaków).

Kodowanie UTF (plik też zapisany jako UTF)
  1. <?php
  2. $tekst = "Dzisiaj żółw nie wychodził z domku!";
  3.  
  4. $alfabet = " !\"#$%&'()*+,-./0123456789:;<=>?@";
  5. $alfabet.= "AaĄąBbCcĆćDdEeĘęFfGgHhIiJjKkLlŁłMmNnŃńOoÓó";
  6. $alfabet.= "PpQqRrSsŚśTtUuVvWwXxYyZzŹźŻż[\]^_`{|}~";
  7.  
  8. for ($i=0;$i<strlen($tekst);$i++) {
  9. $szyfr .= $alfabet[(strpos($alfabet, $tekst[$i])+3) % strlen($alfabet)];
  10. }
  11.  
  12. echo $szyfr;
  13. ?>

Po wykonaniu powinien wyswietlić sie tekst ale z pozamienianymi znakami (przesunięcie o 3). Niestety wyświetlają sie krzaki przy polskich fontach.

Czy ktoś może wie czemu te operacje powodują zmianę kodowania?
Czy ktoś wie jak można naprawić skrypt by prawidłowo działał?

Ten post edytował Altrix 27.04.2012, 13:14:31
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
redeemer
post
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Zamiast strlen() użyj mb_strlen(), zamiast strpos() użyj mb_strpos()

Ten post edytował redeemer 27.04.2012, 13:13:24
Go to the top of the page
+Quote Post
Altrix
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 18.10.2010

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


Niestety nadal nie działa - dalej są krzaki

skrypt wyświetla
  1. eKKL#]QNY#K#Y��J���KN##����W$


a powinien
  1. eŻKTKBL#]QNY#OKF#YŹDJPĘŻKN#Ż#ĘPŃŁW$


Ten post edytował Altrix 27.04.2012, 14:00:43
Go to the top of the page
+Quote Post
redeemer
post
Post #4





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Do pobierania literki ze zmiennej alfabet użyj mb_substr a nie jak teraz $alfabet[ N ]
Go to the top of the page
+Quote Post
Sinevar
post
Post #5





Grupa: Zarejestrowani
Postów: 40
Pomógł: 13
Dołączył: 21.02.2008

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


Takie coś mi działa, zatem i Tobie powinno.

  1. <?php
  2.  
  3. mb_internal_encoding("UTF-8");
  4.  
  5. $step = 3;
  6. $text = "Dzisiaj żółw nie wychodził z domku!";
  7.  
  8. $alphabet = " !\"#$%&'()*+,-./0123456789:;<=>?@";
  9. $alphabet .= "AaĄąBbCcĆćDdEeĘęFfGgHhIiJjKkLlŁłMmNnŃńOoÓó";
  10. $alphabet .= "PpQqRrSsŚśTtUuVvWwXxYyZzŹźŻż[\]^_`{|}~";
  11.  
  12.  
  13. for ($i = 0 ; $i < mb_strlen($text) ; $i++)
  14. {
  15. $szyfr .= mb_substr($alphabet, ((mb_strpos($alphabet, mb_substr($text, $i, 1)) + $step) % mb_strlen($alphabet)), 1);
  16. }
  17.  
  18. echo $szyfr;
Go to the top of the page
+Quote Post
Altrix
post
Post #6





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 18.10.2010

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


Dzięki Sinevar, rzeczywiście działa.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.09.2025 - 12:29