[php/ajax] kodowanie polskie

0

po zastosowaniu AJAXa na mojej stronie
http://isengard.metal.pl/show.php

gdzie tresc przeladowywana pomiedzy podstronami znajduje sie w div-ie o id = 'tresc'
dostalem bledy w kodowaniu stron doladowywanych.

Strona do ktorej sa doladowywane podstrony wyswietla polskie znaki bez problemu, natomiast te doladowywane bez mety maja złe, totez w podstronie 'historia' sporobowalem tez z metą polska ale nie pomogło... nie mam pojecia dlaczego tak to sie wyswietla

po wejsciu jednak bezposrednio na historia.php
http://isengard.metal.pl/pages/historia.php
kodowanie jest OK....

w pozostalych tez jest OK
http://isengard.metal.pl/pages/sklad.php

ale jak juz to doladuje przez AJAX do glownej to polskie znaki znikaja na rzecz '?'

prosze o pomoc

0

spróbuj zapisać sobie wszystkie pliki w UTF-8

0

a kodowanie pliku UTF-16?

0

JS używa domyślnie UTF-8. Więc i ajax wrzuca tekst zakodowany w UTF.

Spróbuj w skrypcie odpowiadającym na żadania ajaxa wysłać nagłówek z kodowaniem odpowiednim dla strony.

0

dzięki, rzeczywiście po zmianie na UTF-8 kodowania podstron (zmiana kodowania na unicode wewnatrz dokumentow nie byla konieczna) podstrony wyswietlaly sie poprawnie (oprocz jednej ktora jest systemem news). W zwiazku z tą 'jedną' starałem się jednak zastosować metodę drugą czyli wprowadzenie wartosci meta w advAJAX. Taki efekt przeróbki:

	<script type="text/javascript">
	
	function pokaz(address,id) {
		
		advAJAX.get({
			url : address,
				onSuccess : function(obj) {
					var element = document.getElementById(id);
					element.innerHTML = obj.responseText;
				},
				onError : function(obj) { 
					alert("Error: " + obj.status); 
				},
			    headers : {
			      "content-type" : "text/html; charset=iso-8859-2",
			      "content-language" : "pl",
			    }
		});
	}
	
	</script>

niestety jak widać dalej są '?' zamiast polskich znaków...

0

w skrypcie php wyślij nagłówek z kodowaniem.
header('Content-type: text/html; charset=iso-8859-2');

0

dzieki wielkie! działa

powiedz mi jeszcze prosze dlaczego jak wpisywalem tagi meta jako html to nie działało a wyslanie za pomoca header() dziala?

0

bo tag meta to coś zupełnie innego. Parser HTML go dopiero czyta. Jako, że ajax nie wykonuje kodu który przyjdzie, znacznik meta stawał się tylko obiektem w drzewie.

0

aha i wszystko jasne dzieki

0

Od kilku dni bawie sie ajaxem i tez mam z tym problem.. przejrzalem kilknascie stron o tej tematyce ale nic z tego nie rozumiem..

a wiec tak mam trzy stronki pierwsza w php/html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" >
<script type='text/javascript' src='b.js'></script>
<title>Bez tytułu 1</title>
</head>

<body>

<input type="text" id="cos" value="śąźźćżńęół" >
<input type="button" value="ok" onclick="dodaj()" >
</body>
</html>

czyli zwykla stronka z polem tekstowym i przyciskiem, ktory wysyla dane do pliku b.js:

function getXMLHttpRequestObiect()
{
	if (window.XMLHttpRequest){
		try{
			return new XMLHttpRequest();
		}
		catch(e){
			return false;
		}
	}
	else if (window.ActiveXObiect){
		var wersjeMSXML= new Array(
			"MSXML2.XMLHTTP.6.0",
			"MSXML2.XMLHTTP.5.0",
			"MSXML2.XMLHTTP.4.0",
			"MSXML2.XMLHTTP.3.0",
			"MSXML2.XMLHTTP",
			"Microsoft.XMLHTTP"
		);
		for (var indeks in wersjeMSXML){
			try{
				return new ActiveXObject(wersjeMSXML[indeks]);
			}
			catch(e){
			}
		}
		return false;
	}
}

function dodaj(){
if (XMLHttpRequestObiect){

var tekst=document.getElementById("cos").value;
alert(tekst);
var url="c.php?&dodaj=true&nazwa="+tekst;
alert(url);

		XMLHttpRequestObiect.open("GET",url);
		XMLHttpRequestObiect.onreadystatechange = function()
		{
			if (XMLHttpRequestObiect.readyState == 4){
				if (XMLHttpRequestObiect.status ==200){
					var tekst = XMLHttpRequestObiect.responseText;
					
					alert(tekst);
					
														
				}
				
			}
		}
		XMLHttpRequestObiect.send(null);

}}

var XMLHttpRequestObiect = getXMLHttpRequestObiect();

tutaj pobieram sobie napis z inputa i wysylam do kolejnego pliku php (to jest tylko przyklad bo normalnie tam mam troche wiecej operacji)

<?php

$polaczenie=mysql_connect('localhost','root','vertrigo');								
if (!$polaczenie) echo ('Blad w polaczeniu z aparatem bazy danych!');													
$stat=mysql_select_db('aaa',$polaczenie);
if (!$stat) echo ('Nie moge sie polaczyc z wybrana baza danych!');


if(isset($_GET['dodaj']) && isset($_GET['nazwa'])){
$nazwa = $_GET['nazwa'];

$query = "INSERT INTO cos (Id,Nazwa) VALUES (NULL,\'$nazwa\')";
$result = mysql_query ($query);

echo $nazwa;
}



?>

i wszystko pieknie ladnie gdyby nie polskie znaki z 1.php wysyla z polskimi znakami w url w 2.js tez mi przesyla polskie znaki dopiero po wywolaniu XMLHttpRequestObiect.open("GET",url); otrzymuje w 3.php jakies znaczki albo nic... dzialaja mi pl znaczki jesli wpierw przed przeslaniem do 3.php zrobie escape ale pozniej mi w bazie zapisuje zakodowany a musi byc z pl literami..

dodam ze wszystkie 3 pliki sa zapisane w utf-8
a kodowanie bazy i porownywanie znakow tez jest w utf8_unicode_ci

pomocyy.. prosze

0

@ddd:
A tak strzelę: jakbyś zrobił w JavaScripcie escape(), a w c.php odkodował to używając urldecode()? Próbowałeś?

0

to samo :/ w js wyskakuje mi w alercie ze jest ok ale w bazie bzdury totalne...
juz myslalem nad zmiena php.ini bo tam jest taka linijka z kodowaniem

; PHP's built-in default is text/html
default_mimetype = "text/html"
;default_charset = "iso-8859-2"

ale tez nic ...

0

w ogóle nie chce mi go odkodować w 3.php i wpisuje zakodowany do bazy..

0

A próbowałeś w tym pliku PHP po prostu wyświetlić to na ekran? Musiałbyś wtedy wywołać 3.php ręcznie, nie poprzez Ajaxa -- ale to się chyba da zrobić bez problemów. Kwerenda jest krótka.

Btw. mam nadzieje, że w prawdziwym projekcie zabezpieczasz się przed SQL-Injection nieco lepiej niż w tym przykładowym kodzie ;-).

0

gdy wyswietlam 3.php na ekran i daje echo tej przekazywanej zmiennej to
sa dwie opcje jesli w notatniku zapisze 3.php w kodowaniu utf8 to sa krzaczki jesli w ascii to wypisuje mi normalnie polskie literki na stronce.. i teraz po prostu obcina mi w bazie literki np z asdfąśśą wpisuje asdf

0

Ale jak robisz to echo w 3.php to masz właściwe kodowanie ustawione? Możesz to ustawić w celach debugujących wysyłając odpowiedni nagłówek, w ten sposób:

header('Content-Type: text/plain; charset=UTF-8');

(Trzeba to zrobić zanim cokolwiek zostanie wypisane czy to z użyciem echo, czy czegokolwiek innego)

Trzeba ustalić gdzie leży problem. Jeśli uda nam się sprawić, żeby w 3.php wszystko wyglądało dobrze, to znaczy, że problem leży w samym zapisie do bazy (albo odczycie z bazy). Może jednak już do 3.php trafiają nieprawidłowo zakodowane dane.

0

wiec tak kodowanie w 1.php zapisane jako utf-8
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />

wysyłany ciag znaków: dćźżąćżćźętę

2.js kodowanie zapisane na utf-8
odbierane i wysyłane:

http://[...]/3.php?&dodaj=true&tekst=dćźżąćżćźętę

3.php

a) zapisane jako utf-8

na samej górze dodane

header('Content-Type: text/plain; charset=UTF-8');

otrzymane:

Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\VertrigoServ\www\xx\3.php:1) in C:\Program Files\VertrigoServ\www\xx\3.php on line 2
d柿������t�INSERT INTO poradnie (IdPoradni,NazwaPoradni) VALUES (NULL,'d柿������t�')

bez headler:

$zmienna=d柿������t�
INSERT INTO poradnie (Id,Nazwa) VALUES (NULL,'d柿������t�')

b) plik zapisany jako ASCI

z headler gdzy chce bezpośrednio w pasku przegladarki dać 3.php.....=dć...
chce mi otwierac plik notatnika z teścia:

$zmienna=dćźżąćżćźętę
INSERT INTO poradnie (Id,Nazwa) VALUES (NULL,'dćźżąćżćźętę')

w bazie zapisuje tak jak wszedzie d柿¹æ¿æŸêtê;

bez headler:

$zmienna=dćźżąćżćźętę
INSERT INTO poradnie (Id,Nazwa) VALUES (NULL,'dćźżąćżćźętę')

w wszystkich przypadkach w bazie:

Nazwa= d柿¹æ¿æŸêtê

Tak sobie myśle jak by zostawić ten 3.php w Asci i jakoś tylko wymusć mu przesyłanie odpowiedniego kodowania do bazy to powinno zadziałać ale to tylko taka myśl

0

Na górze pliku PHP masz BOM. Zakoduj dokument tak, żeby go nie było, na przykład za pomocą Notepada ++

0

Ale ja zapisuje wszystkie 3 pliczki w notatniku i tam zmienilem kodowanie na UTF-8

0

Widzę że nie czytałeś co to jest BOM, zapisz w formacie "UTF-8 (bez BOM)"...

0

Niestety nic nie dało teraz to mi obcina od pierwszego polskiego znaku jak przesyla z 2 do 3 a jak wpisze bezposrednio do 3 to w bazie dalej krzaczki

0

już mi prawie wszędzie działa wystarczylo po podlonczeniu z baza wpisac:

$query='SET CHARACTER SET UTF8';
mysql_query($query);

jeszcze teraz muszę sie uporać z zjadaniem polskich znakow przez exprorera

0

No i lipa nie przesle pl znaków normalnie przez url bo jak mi sie wydaje po prostu te znaki w adresie nie przechodza w ie (chyba ze sie myle co by mnie wielce ucieszylo).

tak sobie mysle czyby nie przeksztalcic najpierw pl znakow w js np escape() wyslac do php i to przekonwertowac znowu normalnie. Ale
\funkcja escape() konwertuje pl znaki na postac %uhhhh gdzie hhhh to cyfry systemu szesnastkowego
a funkcja w php
urldecode() Odkodowuje każdy %## kod z danego łańcucha

czyli jest niezgodnosc typow %uhhhh != %##;

jak by się dało mozna by uzyc funkcji iconv("cos", "na cos", $str); ale nie wiem co tam wpisac, chyba że napisze wlasna funkcje unescape()

ehh [glowa]

0

base64?

1 użytkowników online, w tym zalogowanych: 0, gości: 1