# SQL-Kollation UTF-8 oder was?



## themonk (9. Oktober 2008)

Hallo,
habe zur Zeit das Problem das Ajax die Daten aus meiner Datenbank nicht vernünftig anzeigt.
Nun habe ich raus gefunden das Ajax nur mit UTF-8 läuft da aber meine Datenbanken auf latin1_general_ci gestellt sind können Umlaute nicht angezeigt werden nun ist meine frage, ob man die komplette Datenbank auf UTF-8 stellen kann und den Inhalt auch neu Kodieren kann.Gibt es dafür ein Script oder so?


----------



## kuddeldaddeldu (9. Oktober 2008)

Hi,



themonk hat gesagt.:


> Nun habe ich raus gefunden das Ajax nur mit UTF-8 läuft [...]



Wer behauptet denn sowas? Wenn die serverseitige Resource, die per Ajax angezapft wird, ISO-Latin ausliefert, sollten die Umlaute auch angezeigt werden.

LG


----------



## themonk (9. Oktober 2008)

Naja habe ich so auf Seiten im Internet gelesen.
Und sobald ich in der Ajax Datei an der entsprechenden stelle UTF-8 eingebe werden die Umlaute auch richtig angezeigt nur jetzt werden die aus der Datenbank nicht mehr richtig angezeigt.


----------



## kuddeldaddeldu (9. Oktober 2008)

Hi,



themonk hat gesagt.:


> Naja habe ich so auf Seiten im Internet gelesen.



Tu so, als hättest Du das nie gesehen...  



themonk hat gesagt.:


> Und sobald ich in der Ajax Datei an der entsprechenden stelle UTF-8 eingebe werden die Umlaute auch richtig angezeigt nur jetzt werden die aus der Datenbank nicht mehr richtig angezeigt.



Was meinst Du mit "die Ajax Datei" und was heißt, Du hast da UTF8 eingegeben? 
Vielleicht zeigst Du einfach mal den Code.

LG


----------



## themonk (10. Oktober 2008)

Also in meiner Datenbank die auf latin1 gestellt ist steht ein Text mit äöü.
Nun habe ich eine Datei(Hier werden die Umlaute richtig angezeigt) in dieser Rufe ich dann eine neue Datei mit Ajax auf 


```
....

     xml_http.open(methode, adresse, true);  
       xml_http.onreadystatechange = function() {
         if (xml_http.readyState == 4 && xml_http.status == 200) {
           handler(xml_http.responseText);
         }
       }
test(jj,xml_http);   
   }

      function test(ausgabe,xml_http) {
       var post;
if (ausgabe=='jo'){ 
xml_http.setRequestHeader(
"Content-Type",
"application/x-www-form-urlencoded;");
post="text="+document.test.text.value+"&text2="+document.test.text2.value;
}else{
	post='null';
}
	

       xml_http.send(post);     
   }
   
   
   
   function handler(ausgabe) {
     document.getElementById("ausgabe").innerHTML = ausgabe;  
   }
```
Die Datei die ich Aufrufe hat dann deisen Code

```
<input type='text' value='".$daten->text."' name='text'>";?>
<input type='text' value='' name='text2'>
<input type='button' onclick=\"ArrAjax.aufruf('test.php', handler,
'GET','jo');\" value='Weiter' name='andern'>uöä
```
Hier werden die Umlaute aus der Datenbank "$daten->text" und uöä als ?  dargestellt


----------



## kuddeldaddeldu (10. Oktober 2008)

Hi,



themonk hat gesagt.:


> Die Datei die ich Aufrufe hat dann deisen Code
> 
> ```
> <input type='text' value='".$daten->text."' name='text'>";?>
> ...



dann liefert dieses Script nicht in ISO-Latin aus. Sende den entsprechenden Content-Type Header:


```
header('Content-Type: text/html; charset=iso-8859-1');
```

LG


----------



## themonk (10. Oktober 2008)

Wenn ich aber nun in das Formularfeld text etwas eingebe werden die Umlaute so angezeigt "Ã¤"


----------



## MArc (10. Oktober 2008)

Hey themonk,

du solltest Dir einmal genau vor Augen halten,
welche Kodierungen du bei welcher Übertragung/Speicherung verwendest.

Also,
*) welche Kodierung hat deine Hauptseite( sprich auch die Formulare) auf deiner Seite.
*) welche Kodierung hat die Datenbank.
*) welche Koderung verwendet die Ajax-Schnittstelle(sprich, mit welcher kodierung schickst du die Antworten vom Server).

Eine Lösung könnte sein, dass du die Ajax-Schnittstelle auf dem Server die Strings umkonvertieren lässt.
Stichwort iconv.
Da ich mal annehme, dass du reines HTML darüber schickst, wäre das also kein Problem.
Bei JSON siehst das bissel anders aus.

Vielleicht hilft das.

//Edit
Aber pass auf:
Wenn Dein Server als Kodierung ISO-* an die Ajax-Schnittstelle schickt und deine Website Utf8(oder was anderes) hat
(via meta oder content-type) und du dann das zurückbekommene auf der Website anzeigt gibts bei Umlauten und Sonderzeichen Müll.

Grüße,
 MArc


----------



## themonk (10. Oktober 2008)

*) welche Kodierung hat deine Hauptseite( sprich auch die Formulare) auf deiner Seite:ISO-8859-1
*) welche Kodierung hat die Datenbank:latin1_swedish_ci
*) welche Koderung verwendet die Ajax-Schnittstelle(sprich, mit welcher kodierung schickst du die Antworten vom Server).:Ich denke das ist auch ISO-8859-1 habe zumindest in dem Ajax Script an der Stelle 
	
	
	



```
xml_http.setRequestHeader(
"Content-Type",
"application/x-www-form-urlencoded; charset=ISO-8859-1");
```
eingefügt.

Wenn ich jetzt 
	
	
	



```
iconv("UTF-8", "ISO-8859-1", $_POST['text'])
```
 mach werden die Umlaute richtig Angezeigt. 
Also so würde es funktioniern aber ist das der richtig weg?


----------



## MArc (10. Oktober 2008)

Der richtige Weg ist relativ.
Wenn du deine Hauptseite nicht als UTF-8 ausgeben magst (warum auch immer - empfehlen tu ich es auf jeden fall), dann gibt es kein anderen Weg, außer konvertieren.

Was spricht denn gegen eine Ausgabe der Hauptseite als UTF-8 ?
Sprich, _alles_ ls UTF8 auszugeben/speichern - dann fallen all diese Problem weg.
Die Datenbank haste ja schon in UTF-8.

Grüße,
 MArc


----------



## themonk (10. Oktober 2008)

Das Problem ist das ich bis jetzt meine Seiten im einfach so erstellt habe ohne wirklich drauf zu achten welche Zeichenkodierung ich habe.Wenn ich nun meinen Editor auf UTF-8 umstelle muss ich ja alle Seiten auf Umlaute überprüfen und diese dem entsprechend ändern ansonsten wäre das auch kein problem wenn man nur in den header UTF-8 schreiben müsste.
Werde es mir aber noch überlegen vielleicht wäre es in Zukunft doch sinnvoller die Seiten auf UTF-8 umzustellen.


----------



## kuddeldaddeldu (10. Oktober 2008)

Hi,

Du könntest Deinem Formular mal ein accept-charset verpassen.

LG


----------

