Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP OR JS] Polskie znaki w POST przez Ajax
Babcia@Stefa
post 19.07.2008, 20:00:49
Post #1





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


Witam, kiedy wysyłam treść pliku Ajaxem metodą Post dostaje znaki jakbym użył funkcji htmlspecialchars()" title="Zobacz w manualu PHP" target="_manual

Przykładowo zamiast litery "ś" dostaję "%u015B", tak samo zapisuje się w pliku po edycji :/

Nie mówcie mi "zrezygnuj z ajaxa" bo na nim mam całą stronę... (strona nie jest dla robotów - wogóle nie mają mieć do niej dostępu - prywatna strona)

Być może macie funkcję w PHP lub javascripcie, choć pewnie tylko pod PHP by się dało to ominąć...

Dziękuję, Babcia@Stefa


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
phpion
post 19.07.2008, 20:04:13
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




A czy htmlspecialchars() na wpływ na polskie znaki? Moim zdaniem problem lezy w kodowaniach: inne po stronie PHP, inne po stronie AJAXa. Zapewne stronkę masz w ISO, natomiast dane poprzez AJAX lecą jako UTF.
Go to the top of the page
+Quote Post
Babcia@Stefa
post 19.07.2008, 20:21:03
Post #3





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


htmlspecialchars() zmienia tagi < i > na &lt; i &gt; , czyli działa podobnie smile.gif

Jak mogę ajaxem kodować do ISO-8859-2?


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
batman
post 19.07.2008, 20:35:34
Post #4





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Użyj funkcji urlencode przed wysłaniem i urldecode podczas odbierania danych.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
phpion
post 19.07.2008, 20:36:35
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Nie no, można wręcz powiedzieć, że działa podobnie jak str_replace - bo też zamienia znaki. Moim zdaniem najlepszym wyjściem jest przekodowanie strony na UTF lub (najprostsze rozwiązanie) skorzystanie z iconv" title="Zobacz w manualu PHP" target="_manual przy odbieraniu treści.
Go to the top of the page
+Quote Post
Babcia@Stefa
post 19.07.2008, 20:39:33
Post #6





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


Cytat(batman @ 19.07.2008, 19:35:34 ) *
Użyj funkcji urlencode przed wysłaniem i urldecode podczas odbierania danych.


To znaczy jak mam użyć przed wysłaniem?

Dane z pliku mam wklejane do textarea, po id są wyciągane dane z textarea i wysyłane ajaxem... - gdzie tu upchnę urldecode? :/

@phpion
Co proponujesz z iconv? jakie kodowanie wejściowe a jakie wyjściowe?
Jak automatycznie sprawdzic kodowanie?

Dziękuję, Babcia@Stefa

Ten post edytował Babcia@Stefa 19.07.2008, 20:40:24


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
batman
post 19.07.2008, 20:48:58
Post #7





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




iconv zmienia kodowanie znaków, a problem jest związany nie z kodowaniem znaków, a z innym kodowaniem winksmiley.jpg

A jak tego użyć? Bardzo prosto
  1. <?php
  2. $przed_wyslaniem = urlencode('Jakiś tekst z polskimi znakami');
  3. // tutaj wysylasz ajaxem
  4.  
  5. // kod w skrypcie po stronie serwera
  6. $odebrane = urldecode($zakodowana_zmienna_z_post);
  7. ?>


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
Babcia@Stefa
post 19.07.2008, 20:51:37
Post #8





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


Ale problem tkwi w tym że nie wrzucę tekstu filtrowanego przez urlencode do textarea bo tam będą te "krzaczki" tongue.gif

Ten post edytował Babcia@Stefa 19.07.2008, 20:52:01


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
phpion
post 19.07.2008, 20:54:43
Post #9





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(Babcia@Stefa @ 19.07.2008, 21:39:33 ) *
Co proponujesz z iconv? jakie kodowanie wejściowe a jakie wyjściowe?

Masz mnie za wróżkę? Nie wiem, kombinuj!
Go to the top of the page
+Quote Post
Babcia@Stefa
post 19.07.2008, 20:55:29
Post #10





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


Jak sprawdzić kodowanie wejściowe?


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
batman
post 19.07.2008, 20:55:57
Post #11





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Nie rozumiem. Chodzi Ci o to, że masz textarea, z którego wysyłasz dane ajaxem? Jeśli tak, to przed ich wysłaniem używasz funkcji urlencode i już. Możesz też sprawdzić, czy pomoże samo użycie funkcji urldecode. Możliwe, że przeglądarka sama koduje wysyłany tekst.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
Babcia@Stefa
post 19.07.2008, 20:58:32
Post #12





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


Samo używanie funkcji urldecode nie pomaga, sprawdzałem przed założeniem tematu...
W funkcji wysyłaniu przez ajax ustawiłem kodowanie w nagłówkach na ISO-8859-2 ... takie jakie mam wszędzie smile.gif

@edit
Dawałem urlencode do textarea (wstawiałem tekst z pliku i filtrowałem przy pomocy urlencode) i zamienia mi znaki spacji na + itp. w textarea :/

@edit
Dodam że ... uuu... używam bibliteki base64, ona chyba przekształca kod... omg...

  1. function base64_encode(input) {
  2. input = escape(input);
  3. var output = "";
  4. var chr1, chr2, chr3 = "";
  5. var enc1, enc2, enc3, enc4 = "";
  6. var i = 0;
  7.  
  8. do {
  9. chr1 = input.charCodeAt(i++);
  10. chr2 = input.charCodeAt(i++);
  11. chr3 = input.charCodeAt(i++);
  12.  
  13. enc1 = chr1 >> 2;
  14. enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
  15. enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
  16. enc4 = chr3 & 63;
  17.  
  18. if (isNaN(chr2)) {
  19. enc3 = enc4 = 64;
  20. } else if (isNaN(chr3)) {
  21. enc4 = 64;
  22. }
  23.  
  24. output = output +
  25. keyStr.charAt(enc1) +
  26. keyStr.charAt(enc2) +
  27. keyStr.charAt(enc3) +
  28. keyStr.charAt(enc4);
  29. chr1 = chr2 = chr3 = "";
  30. enc1 = enc2 = enc3 = enc4 = "";
  31. } while (i < input.length);
  32.  
  33. return output;
  34. }
  35.  
  36. function base64_decode(input) {
  37. var output = "";
  38. var chr1, chr2, chr3 = "";
  39. var enc1, enc2, enc3, enc4 = "";
  40. var i = 0;
  41.  
  42. // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
  43. var base64test = /[^A-Za-z0-9\+\/\=]/g;
  44. if (base64test.exec(input)) {
  45. alert("There were invalid base64 characters in the input text.\n" +
  46. "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
  47. "Expect errors in decoding.");
  48. }
  49. input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  50.  
  51. do {
  52. enc1 = keyStr.indexOf(input.charAt(i++));
  53. enc2 = keyStr.indexOf(input.charAt(i++));
  54. enc3 = keyStr.indexOf(input.charAt(i++));
  55. enc4 = keyStr.indexOf(input.charAt(i++));
  56.  
  57. chr1 = (enc1 << 2) | (enc2 >> 4);
  58. chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
  59. chr3 = ((enc3 & 3) << 6) | enc4;
  60.  
  61. output = output + String.fromCharCode(chr1);
  62.  
  63. if (enc3 != 64) {
  64. output = output + String.fromCharCode(chr2);
  65. }
  66. if (enc4 != 64) {
  67. output = output + String.fromCharCode(chr3);
  68. }
  69.  
  70. chr1 = chr2 = chr3 = "";
  71. enc1 = enc2 = enc3 = enc4 = "";
  72.  
  73. } while (i < input.length);
  74.  
  75. return unescape(output);
  76. }


@edit
Ale przecierz odkodowuje przez base64 po stronie serwera...

Ten post edytował Babcia@Stefa 19.07.2008, 21:12:33


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
em1X
post 20.07.2008, 23:21:32
Post #13





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


Cytat(phpion @ 19.07.2008, 21:36:35 ) *
(...) lub (najprostsze rozwiązanie) skorzystanie z [manual\]iconv\[/manual\] przy odbieraniu treści.


iconv jest do dupy, ma czasem problemy z poprawną konwersją.. polecam MultibyteString !


--------------------
eh, co polska wódka to polska wódka
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: 12.07.2025 - 07:13