Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [Ajax] Polskie znaki
impuls2003
post 15.08.2006, 00:54:01
Post #1





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 15.08.2006

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


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">

Ten post edytował impuls2003 15.08.2006, 13:56:54
Go to the top of the page
+Quote Post
mariuszn3
post 15.08.2006, 14:08:41
Post #2





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


a po co je koduejesz w tym pierwszym kodzie za pomocą urlencode() ?
Go to the top of the page
+Quote Post
impuls2003
post 15.08.2006, 14:15:41
Post #3





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 15.08.2006

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


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

Ten post edytował impuls2003 15.08.2006, 14:19:11
Go to the top of the page
+Quote Post
mariuszn3
post 15.08.2006, 14:27:29
Post #4





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


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.
Go to the top of the page
+Quote Post
impuls2003
post 15.08.2006, 14:32:47
Post #5





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 15.08.2006

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


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.
Go to the top of the page
+Quote Post
mariuszn3
post 15.08.2006, 14:35:21
Post #6





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


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
Go to the top of the page
+Quote Post
impuls2003
post 15.08.2006, 14:41:07
Post #7





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 15.08.2006

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


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
Go to the top of the page
+Quote Post
mariuszn3
post 15.08.2006, 14:47:55
Post #8





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


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.
Go to the top of the page
+Quote Post
impuls2003
post 15.08.2006, 14:58:14
Post #9





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 15.08.2006

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


> 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.
Go to the top of the page
+Quote Post
bim2
post 15.08.2006, 15:12:42
Post #10





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Nieno ja tez mam taki problem. Wysylam iso a ajax np zamiast ś wstawia 1/4 ;/ Jak zmienic ajaxowi kodowani tongue.gif?


--------------------
Go to the top of the page
+Quote Post
mariuszn3
post 15.08.2006, 15:21:12
Post #11





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


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).
Go to the top of the page
+Quote Post
Balon
post 15.08.2006, 15:37:24
Post #12





Grupa: Zarejestrowani
Postów: 422
Pomógł: 0
Dołączył: 14.12.2005
Skąd: Wałbrzych

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


ja dzisiaj bawilem sie iconv" title="Zobacz w manualu php" target="_manual


--------------------
Postura wielka i morda wredna, jestem Balon, kozak z osiedla !
bzdury.pl - Królestwo rozrywki
Go to the top of the page
+Quote Post
impuls2003
post 15.08.2006, 16:27:37
Post #13





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 15.08.2006

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


Problem lezy po stronie javascript unescape()
Pisze wlasna funkcje unescape smile.gif
Go to the top of the page
+Quote Post
bim2
post 15.08.2006, 18:02:32
Post #14





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


@balon: znasz jakąś funkcję zastępcza. Bo mi nie chce ona działać. Mb convert też nie działa ;(


--------------------
Go to the top of the page
+Quote Post
impuls2003
post 15.08.2006, 19:46:32
Post #15





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 15.08.2006

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


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
Go to the top of the page
+Quote Post
mariuszn3
post 15.08.2006, 19:51:21
Post #16





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


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

Ten post edytował mariuszn3 15.08.2006, 19:53:24
Go to the top of the page
+Quote Post
impuls2003
post 16.08.2006, 00:48:50
Post #17





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 15.08.2006

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


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
Go to the top of the page
+Quote Post
UNK
post 16.08.2006, 06:47:39
Post #18





Grupa: Zarejestrowani
Postów: 93
Pomógł: 5
Dołączył: 30.04.2006
Skąd: Gliwice

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


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.

Ten post edytował UNK 16.08.2006, 06:57:31
Go to the top of the page
+Quote Post
impuls2003
post 17.08.2006, 00:57:52
Post #19





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 15.08.2006

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


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
Go to the top of the page
+Quote Post
mariuszn3
post 17.08.2006, 16:37:50
Post #20





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


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.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 29.03.2024 - 14:42