Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP OR JS] Polskie znaki w POST przez Ajax
Forum PHP.pl > Forum > PHP
Babcia@Stefa
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
phpion
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.
Babcia@Stefa
htmlspecialchars() zmienia tagi < i > na &lt; i &gt; , czyli działa podobnie smile.gif

Jak mogę ajaxem kodować do ISO-8859-2?
batman
Użyj funkcji urlencode przed wysłaniem i urldecode podczas odbierania danych.
phpion
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.
Babcia@Stefa
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
batman
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. ?>
Babcia@Stefa
Ale problem tkwi w tym że nie wrzucę tekstu filtrowanego przez urlencode do textarea bo tam będą te "krzaczki" tongue.gif
phpion
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!
Babcia@Stefa
Jak sprawdzić kodowanie wejściowe?
batman
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.
Babcia@Stefa
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...
em1X
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 !
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.