Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ AJAX _ [Ajax] Polskie znaki

Napisany przez: impuls2003 15.08.2006, 00:54:01

Mam mianowicie taki problem:

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

  1. <?
  2. http://www.php.net/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 (!http://www.php.net/isset ($tryb)) {$tryb='';}
  10. if ($tryb == 'ajax') {http://www.php.net/echo http://www.php.net/urlencode("ąĄćĆęĘłŁóÓśŚźŹżŻ&plusmn;ˇ&para;&brvbar;Ľ&not;Ńń"); http://www.php.net/exit;} 
  11. ?>
  12. <body>
  13. </body>


Funkcja odczytujaca dane

  1. <?php
  2. function http://www.php.net/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.http://www.php.net/substr(i,3) );
  21. += 3;
  22. } else {
  23. alert( 'Bad escape combination near ...' + encoded.http://www.php.net/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 = http://www.php.net/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">

Napisany przez: mariuszn3 15.08.2006, 14:08:41

a po co je koduejesz w tym pierwszym kodzie za pomocą urlencode() ?

Napisany przez: impuls2003 15.08.2006, 14:15:41

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

Napisany przez: mariuszn3 15.08.2006, 14:27:29

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.

Napisany przez: impuls2003 15.08.2006, 14:32:47

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.

Napisany przez: mariuszn3 15.08.2006, 14:35:21

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

Napisany przez: impuls2003 15.08.2006, 14:41:07

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

Napisany przez: mariuszn3 15.08.2006, 14:47:55

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.

Napisany przez: impuls2003 15.08.2006, 14:58:14

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

Napisany przez: bim2 15.08.2006, 15:12:42

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

Napisany przez: mariuszn3 15.08.2006, 15:21:12

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

Napisany przez: Balon 15.08.2006, 15:37:24

ja dzisiaj bawilem sie http://pl.php.net/iconv

Napisany przez: impuls2003 15.08.2006, 16:27:37

Problem lezy po stronie javascript unescape()
Pisze wlasna funkcje unescape smile.gif

Napisany przez: bim2 15.08.2006, 18:02:32

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

Napisany przez: impuls2003 15.08.2006, 19:46:32

Rozwiazanie (nie widzialem tego wogule w internecie smile.gif

Plik php wczytujacy dane:

  1. <?php
  2. if ($tryb == 'ajax') {http://www.php.net/echo pl_iso_escape_URL2escape_javascript(http://www.php.net/urlencode($content)); http://www.php.net/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

Napisany przez: mariuszn3 15.08.2006, 19:51:21

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

Napisany przez: impuls2003 16.08.2006, 00:48:50

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

Napisany przez: UNK 16.08.2006, 06:47:39

Aby JS działał musisz przepuścić responseText przez dodatkową funckję.
Poczytaj trochę tutaj:
http://forum.php.pl/advAJAX-HTML-oraz-JavaScript-w-responseText-t49058.html

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.

Napisany przez: impuls2003 17.08.2006, 00:57:52

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') {http://www.php.net/echo pl_iso_escape_URL2escape_javascript(http://www.php.net/urlencode($content)); http://www.php.net/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

Napisany przez: mariuszn3 17.08.2006, 16:37:50

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.

Napisany przez: legorek 17.08.2006, 16:59:16

Jak przeczytałem te kombinacje o mało co z krzesła nie spadłem :-)

test.php

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


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


Z palca wpisane, ale tak to wygląda, żadnych konwersji itd. Odpowiednie kodowanie, takie same dla obu plików.

Napisany przez: impuls2003 17.08.2006, 18:53:14

Wpisalem powyzszy przyklad na strone.
http://www.jacob.impuls.webd.pl/usun/index.php#

IE6 PL - krzaki
FF - OK

Mozna sprawdzic

Napisany przez: legorek 24.08.2006, 10:56:07

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

http://img354.imageshack.us/my.php?image=proofuq8.gif

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.

Napisany przez: impuls2003 24.08.2006, 11:55:37

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

Napisany przez: bim2 24.08.2006, 11:56:05

Standardowa odpowiedź informatyków: dziwne, u mnie niedziała :-)
Rkingsmiley.png ;D

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)