Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Ajax] Polskie znaki
Forum PHP.pl > Forum > XML, AJAX > AJAX
impuls2003
Mam mianowicie taki problem:

Dokument jest w iso-8859-2
Wczytuje ajaxem dane w ten sposob:

  1. <?
  2. header("Content-Type: text/html; charset=iso-8859-2"); 
  3. ?>
  4.  
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  7. </head>
  8. <? 
  9.  if (!isset ($tryb)) {$tryb='';}
  10. if ($tryb == 'ajax') {echo urlencode("ąĄćĆęĘłŁóÓśŚźŹżŻ&plusmn;ˇ&para;&brvbar;Ľ&not;Ńń"); exit;} 
  11. ?>
  12. <body>
  13. </body>


Funkcja odczytujaca dane

  1. <?php
  2. function URLDecode( $tekst )
  3. {
  4.  // Replace + with ' '
  5.  // Replace %xx with equivalent character
  6.  // Put [ERROR] in output if %xx is invalid.
  7.  var HEXCHARS = "0123456789ABCDEFabcdef"; 
  8.  var encoded = $tekst;
  9.  var plaintext = "";
  10.  var i = 0;
  11.  while (< encoded.length) {
  12.  var ch = encoded.charAt(i);
  13.  if (ch == "+") {
  14.  plaintext += " ";
  15.  i++;
  16.  } else if (ch == "%") {
  17. if (< (encoded.length-2) 
  18. && HEXCHARS.indexOf(encoded.charAt(i+1)) != -
  19. && HEXCHARS.indexOf(encoded.charAt(i+2)) != -) {
  20. plaintext += unescape( encoded.substr(i,3) );
  21. += 3;
  22. } else {
  23. alert( 'Bad escape combination near ...' + encoded.substr(i) );
  24. plaintext += "%[ERROR]";
  25. i++;
  26. }
  27. } else {
  28.  plaintext += ch;
  29.  i++;
  30. }
  31. } // while
  32.  return plaintext;
  33. };
  34.  
  35. function wstawajax (adresurl) {
  36.  advAJAX.get({
  37. url: adresurl,
  38. onSuccess : function(obj) { gEBI('zawartosc').innerHTML = URLDecode(obj.responseText); },
  39. onError : function(obj) { alert("Error: " + obj.status); }
  40. });
  41. }
  42. ?>



I teraz funkcja javascript zamiast tworzyc mi 8859-2, tworzy mi zdaje sie utf-16 i na ekranie mam krzaczki
Normalne znaki sa jako ascii, a polskie znaki sa jako utf

Probowalem wszystkich znalezionych metod, ale nic to nie dalo

Podglad problemu:
http://www.jacob.impuls.webd.pl/
LINK: POCZTA UPOMINKOWA/TEST

Moznabybylo zrobic zeby zostalo tak ze: innerHTML = URLDecode(obj.responseText); },
a dac jakas akcje na warstwie ze przy zmianie zawartosci dekoduje php-owskim urldecode.
Tylko jakos nie wyobrazam sobie tego rozwiazania

Przed <head> mam:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
mariuszn3
a po co je koduejesz w tym pierwszym kodzie za pomocą urlencode() ?
impuls2003
Probowale bez urlencode, i urldecode. Mialem zamiast polskich literek ?
Wiec wstawilem encode.
Ladnie mi dekoduje javascript, z tymze zwraca utf-16 a nie ascii-iso8859-2.

Z tego co mysle ajax operuje domyslnie na innym kodowaniu niz 8859-2.

Wyczytalem na forach m.in., zeby wstawic header("Content-Type: text/html; charset=iso-8859-2"); , ale to nic nie zmienia
mariuszn3
a w jakim kodowaniu masz zapisany ten plik php i w jakim kodowaniu jest Twoja strona.. bo na pewno danych wysyłanych z serwera do ajaxa nie musisz a nawet nie powienieś niczym cytować... ważne by kodowania były zgodne to wszystko.
impuls2003
Strone obsluguje jeden plik index.php
Kodowany jest on w iso8859-2 (pisany glownie w normalnym notatniku)
Dane sa wysylane tez w 8859-2

Czyli strona ma ustawione jednolite kodowanie.
mariuszn3
A skąd wiesz, że normalny notatnik zapisuje dane w iso8859-2 (bo normalny notatnik zapisuje dane w windows-1250) smile.gif
Domniemam, że pracujesz na windows'ie
impuls2003
A co za problem poprawic w notatniku literki na iso8859-2 (opcja kopiuj wklej literke) smile.gif
Wiekszosc rzeczy jest wpisywana poprzez panel admina gdzie jest domyslnie 8859-2.
Czy 1250 czy 8859-2 to jest 8-bitowy ASCII.
Fakt faktem calosc jest w 8859-2.
Jak wkleje wygenerowany kod do notatnika i probuje go zapisac to notatnik mowi mi ze znaki sa kodowane unicode itd
mariuszn3
impuls.. ja Ci tylko chcę pomóc. Twój problem najprawdopodobniej wynika z tego, że wysyłasz dane, którą są w innym kodowaniu niż strona.
impuls2003
> impuls.. ja Ci tylko chcę pomóc.

Wiem. Nic zlego na mysli nie mialem.
W kazdym razie dzieki.

> Twój problem najprawdopodobniej wynika z tego, że wysyłasz dane, którą są w innym kodowaniu niż strona.

Mozliwe. Ale skoro otwieram w notatniku tekst, sa krzaczki to znaczy ze jest to iso8859-2.
W kazdym razie sprawdzam i sprawdze dokladnie problem.

A teraz pytanie:
Na jakim kodowaniu operuje funkcja javascript escape i unescape?
Bo tego sie nigdzie nie ustawia.
bim2
Nieno ja tez mam taki problem. Wysylam iso a ajax np zamiast ś wstawia 1/4 ;/ Jak zmienic ajaxowi kodowani tongue.gif?
mariuszn3
javascript bierze dane binarnie tak jak php, po prostu jako bity.. funkcje escape i unescape po prostu szukają konkretnych bitów i je zamieniają.. Te bity, które one zamieniają wyglądają tak samo w kodowaniach iso jaki utf8. Problem tylko utf8 jest taki, że jest to kodowanie multibitowe (są znaki i jednobitowe i dwa, trzy czterobitowe) ..przez to może być możliwość (ale tego nie wiem), że escape i unescape coś schrzanią (bo one za pewne traktują każdy bit jako jeden znak).
Balon
ja dzisiaj bawilem sie iconv" title="Zobacz w manualu php" target="_manual
impuls2003
Problem lezy po stronie javascript unescape()
Pisze wlasna funkcje unescape smile.gif
bim2
@balon: znasz jakąś funkcję zastępcza. Bo mi nie chce ona działać. Mb convert też nie działa ;(
impuls2003
Rozwiazanie (nie widzialem tego wogule w internecie smile.gif

Plik php wczytujacy dane:
  1. <?php
  2. if ($tryb == 'ajax') {echo pl_iso_escape_URL2escape_javascript(urlencode($content)); exit;}
  3. ?>


Kod javascript odczytujacy dane:

  1. <?php
  2. function URLDecodespacja( $tekst )
  3. {
  4.  // Replace + with ' '
  5.  // Replace %xx with equivalent character
  6.  // Put [ERROR] in output if %xx is invalid.
  7.  var HEXCHARS = "0123456789ABCDEFabcdef"; 
  8.  var encoded = $tekst;
  9.  var plaintext = "";
  10.  var i = 0;
  11.  while (< encoded.length) {
  12.  var ch = encoded.charAt(i);
  13.  if (ch == "+") {
  14.  plaintext += " ";
  15.  i++;
  16.  } else {
  17.  plaintext += ch;
  18.  i++;
  19. }
  20. } // while
  21.  return plaintext;
  22. };
  23.  
  24. function wstawajax (adresurl) {
  25.  advAJAX.get({
  26. url: adresurl,
  27.  onSuccess : function(obj) { gEBI('zawartosc').innerHTML = URLDecodespacja(unescape(obj.responseText)); },
  28. onError : function(obj) { alert("Error: " + obj.status); }
  29. });
  30. }
  31. ?>


Musimy miec biblioteke php (do znalezienia w sieci):
7-1-biblioteka-pl.zip
mariuszn3
Jak to jest, że wszędzie gdzie używam ajaxa nie muszę niczego cytować (escape'ować).. i przechodzą mi polskie literki, francuskie i nawet chińskie..
impuls2003
I teraz np. mam lighbox js (ten efekt do zdjec) i te zdjecia ze znacznikiem rel="xxx" wczytane z ajaxa to nie wchodzi mi ten efekt lightbox.

Zeby nie zasmiecac pisze w tym samym poscie.
Nastepna sprawa.
Zainstalowalem PEAR i HTML_Ajax.
I mam znowu znaki zapytania zamiast polskich liter.
Doszukalem sie funkcji setrequestheader. Tylko nie wiem jak ja uzyc.

Rozwiazanie ostateczne:
Skoro javascript operuje na UTF, to nie mozemy wysylac w ISO-8859-2, tylko przed wyslaniem musimy zamienic na UTF, np. tak

<?
if (!isset ($tryb)) {$tryb='';}
if ($tryb == 'ajax') {echo pl_iso2utf8($content); exit;}
?>

Wreszcie doszlem co jest (po 3 dniach). smile.gif
UNK
Aby JS działał musisz przepuścić responseText przez dodatkową funckję.
Poczytaj trochę tutaj:
Temat: advAJAX HTML oraz JavaScript w responseText

A tak w ogóle jeśli masz możliwość zainstalowania pakietów do php to zinstaluj sobie iconv (to z postu Balona) bardzo użyteczna funkcja przy takich przypadkach. Ja np musze z tego skorzystać bo przy jednym projekcie działam na bazie oraz stronie zakodowanej wg moje widzimisię :-) (wybrałem UTF-8), ale druga baza - mssql pracuje na innym kodowaniu (wydawało by się że jeśli M$ tongue.gif to byłoby Windows-1250) iso-8859-2 i to jest najszybszy sposób na zmianę kodowania pobieranych pól.
impuls2003
Ok. A co zrobic jesli w IE chodzi, a w FF krzaczy i za sekunde zawartosc znika i takjakby sie wczytywalo cos caly czas?

Link mam tak:

<a title="Test" href="#" onclick="java script:HTML_AJAX.replace('zawartosc','index.php?tryb=ajax&p=p_17');return true;">Test</a>



-----------------------------------------------------------------------------------------
Dziala juz wszystko.
Zaimplementowalem na probe do plywajacej galerii na http://www.jacob.impuls.webd.pl/.
Jesli ktos ma problemy to rozwiazanie mu pomoze.
Sprawdzalem pod IE6, FF, Opera, Netscape. Dziala.

Dziala to tak:
  1. <?php
  2. Wysylanie php:
  3. if ($tryb == 'ajax') {echo pl_iso_escape_URL2escape_javascript(urlencode($content)); exit;}
  4. Odbieranie javascr:
  5. onSuccess : function(obj) { gEBI('zawartosc').innerHTML = URLDecodespacja(unescape(obj.responseText)); },
  6. ?>

Co ciekawe ten kod: URLDecodespacja(unescape()) zwraca mi nie utf tylko normalnie iso8859-2.
Z tymze wykorzystalem u siebie biblioteki PEAR HTML_AJAX
Mozecie sobie podgladnac kod strony.

Dziwne to wszystko, ale wazne ze chodzi smile.gif

No, moglem przejsc jeszcze na kodowanie strony utf-8, ale zmieniac teraz wszystkie teksty na stronie sad.gif
mariuszn3
W ogóle ostatnio przyszło mi do głowy co może być przyczyną waszych problemów - Dokument, który wysyłacie w odpowiedzi na zapytanie xmlHttp też musi nieść ze sobą informację o tym w jakim kodowaniu jest napisany.
legorek
Jak przeczytałem te kombinacje o mało co z krzesła nie spadłem :-)

test.php
  1. <?php
  2. header('Content-Type: text/html; charset=ISO-8859-2');
  3. echo 'ąśźć';
  4. ?>


plik.html
  1. <meta http-equiv="content-type" content="text/html; charset=iso-8859-2" />
  2. <script type="text/javascript" src="advajax.js"></script>
  3. function DoCostam() {
  4. advAJAX.get({
  5. url: "test.php",
  6. onSuccess : function(obj) {
  7. alert(obj.responseText);
  8. },
  9. onError : function(obj) {
  10. alert("Przepraszamy ale wystąpił błąd: " + obj.status);
  11. }
  12. });
  13. </head>
  14. <body onLoad="DoCostam();">
  15. </body>
  16. </html>


Z palca wpisane, ale tak to wygląda, żadnych konwersji itd. Odpowiednie kodowanie, takie same dla obu plików.
impuls2003
Wpisalem powyzszy przyklad na strone.
http://www.jacob.impuls.webd.pl/usun/index.php#

IE6 PL - krzaki
FF - OK

Mozna sprawdzic
legorek
Standardowa odpowiedź informatyków: dziwne, u mnie działa :-)



Aj zauważyłem błąd w swoim kodzie!

jest

Kod
onError : function(obj) {
alert("Przepraszamy ale wystąpił błąd: " + obj.status);
},


ma być:

Kod
onError : function(obj) {
alert("Przepraszamy ale wystąpił błąd: " + obj.status);
}


Może teraz będzie OK też w IE.
impuls2003
Nic to nie zmienia bo mialem wpisane bez błędu:

  1. <?php
  2. <script type="text/javascript">
  3. function gEBI( objId ){
  4. return document.getElementById( objId );
  5. }
  6. function wstawajax (adresurl) {
  7.  advAJAX.get({
  8. url: adresurl,
  9. onSuccess : function(obj) { alert (obj.responseText); gEBI('zawartosc').innerHTML = obj.responseText; },
  10. onError : function(obj) { alert("Error: " + obj.status); }
  11. });
  12. }
  13. </script>
  14. ?>


Pozdrawiam
bim2
Standardowa odpowiedź informatyków: dziwne, u mnie niedziała :-)
Rkingsmiley.png ;D
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.