Mam mianowicie taki problem:
Dokument jest w iso-8859-2
Wczytuje ajaxem dane w ten sposob:
<? http://www.php.net/header("Content-Type: text/html; charset=iso-8859-2"); ?> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" /> </head> <? if (!http://www.php.net/isset ($tryb)) {$tryb='';} if ($tryb == 'ajax') {http://www.php.net/echo http://www.php.net/urlencode("ąĄćĆęĘłŁóÓśŚźŹżŻ±ˇ¶¦Ľ¬Ńń"); http://www.php.net/exit;} ?> <body> </body>
<?php function http://www.php.net/urldecode( $tekst ) { // Replace + with ' ' // Replace %xx with equivalent character // Put [ERROR] in output if %xx is invalid. var HEXCHARS = "0123456789ABCDEFabcdef"; var encoded = $tekst; var plaintext = ""; var i = 0; while (i < encoded.length) { var ch = encoded.charAt(i); if (ch == "+") { plaintext += " "; i++; } else if (ch == "%") { if (i < (encoded.length-2) && HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 && HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) { plaintext += unescape( encoded.http://www.php.net/substr(i,3) ); i += 3; } else { alert( 'Bad escape combination near ...' + encoded.http://www.php.net/substr(i) ); plaintext += "%[ERROR]"; i++; } } else { plaintext += ch; i++; } } // while return plaintext; }; function wstawajax (adresurl) { advAJAX.get({ url: adresurl, onSuccess : function(obj) { gEBI('zawartosc').innerHTML = http://www.php.net/urldecode(obj.responseText); }, onError : function(obj) { alert("Error: " + obj.status); } }); } ?>
a po co je koduejesz w tym pierwszym kodzie za pomocą urlencode() ?
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
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.
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.
A skąd wiesz, że normalny notatnik zapisuje dane w iso8859-2 (bo normalny notatnik zapisuje dane w windows-1250)
Domniemam, że pracujesz na windows'ie
A co za problem poprawic w notatniku literki na iso8859-2 (opcja kopiuj wklej literke)
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
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.
> 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.
Nieno ja tez mam taki problem. Wysylam iso a ajax np zamiast ś wstawia 1/4 ;/ Jak zmienic ajaxowi kodowani ?
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).
ja dzisiaj bawilem sie http://pl.php.net/iconv
Problem lezy po stronie javascript unescape()
Pisze wlasna funkcje unescape
@balon: znasz jakąś funkcję zastępcza. Bo mi nie chce ona działać. Mb convert też nie działa ;(
Rozwiazanie (nie widzialem tego wogule w internecie
Plik php wczytujacy dane:
<?php if ($tryb == 'ajax') {http://www.php.net/echo pl_iso_escape_URL2escape_javascript(http://www.php.net/urlencode($content)); http://www.php.net/exit;} ?>
<?php function URLDecodespacja( $tekst ) { // Replace + with ' ' // Replace %xx with equivalent character // Put [ERROR] in output if %xx is invalid. var HEXCHARS = "0123456789ABCDEFabcdef"; var encoded = $tekst; var plaintext = ""; var i = 0; while (i < encoded.length) { var ch = encoded.charAt(i); if (ch == "+") { plaintext += " "; i++; } else { plaintext += ch; i++; } } // while return plaintext; }; function wstawajax (adresurl) { advAJAX.get({ url: adresurl, onSuccess : function(obj) { gEBI('zawartosc').innerHTML = URLDecodespacja(unescape(obj.responseText)); }, onError : function(obj) { alert("Error: " + obj.status); } }); } ?>
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..
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).
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$ to byłoby Windows-1250) iso-8859-2 i to jest najszybszy sposób na zmianę kodowania pobieranych pól.
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:
<?php Wysylanie php: if ($tryb == 'ajax') {http://www.php.net/echo pl_iso_escape_URL2escape_javascript(http://www.php.net/urlencode($content)); http://www.php.net/exit;} Odbieranie javascr: onSuccess : function(obj) { gEBI('zawartosc').innerHTML = URLDecodespacja(unescape(obj.responseText)); }, ?>
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.
Jak przeczytałem te kombinacje o mało co z krzesła nie spadłem :-)
test.php
<?php http://www.php.net/header('Content-Type: text/html; charset=ISO-8859-2'); http://www.php.net/echo 'ąśźć'; ?>
<http://december.com/html/4/element/html.html> <http://december.com/html/4/element/head.html> <http://december.com/html/4/element/meta.html http-equiv="content-type" content="text/html; charset=iso-8859-2" /> <http://december.com/html/4/element/script.html type="text/javascript" src="advajax.js"></http://december.com/html/4/element/script.html> <http://december.com/html/4/element/script.html> function DoCostam() { advAJAX.get({ url: "test.php", onSuccess : function(obj) { alert(obj.responseText); }, onError : function(obj) { alert("Przepraszamy ale wystąpił błąd: " + obj.status); } }); </http://december.com/html/4/element/script.html> </http://december.com/html/4/element/head.html> <http://december.com/html/4/element/body.html onLoad="DoCostam();"> </http://december.com/html/4/element/body.html> </http://december.com/html/4/element/html.html>
Wpisalem powyzszy przyklad na strone.
http://www.jacob.impuls.webd.pl/usun/index.php#
IE6 PL - krzaki
FF - OK
Mozna sprawdzic
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
Nic to nie zmienia bo mialem wpisane bez błędu:
<?php <script type="text/javascript"> function gEBI( objId ){ return document.getElementById( objId ); } function wstawajax (adresurl) { advAJAX.get({ url: adresurl, onSuccess : function(obj) { alert (obj.responseText); gEBI('zawartosc').innerHTML = obj.responseText; }, onError : function(obj) { alert("Error: " + obj.status); } }); } </script> ?>
Standardowa odpowiedź informatyków: dziwne, u mnie niedziała :-)
;D
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)