Verrücktes charset Problem

Don83

New Member
Hallo liebe community,
ich habe nun schon seit einigen Wochen ein Problem mit den charsets. Mit den gängigen Methoden bekomme ich einfach keine Lösung zustande.
Also folgendes: Ich habe eine Datenbank.

Habe dort eine Testtabelle angelegt: jos_test
einen Testwert eingetragen: INSERT into jos_test ..."Größe der Böße".....
Jetzt habe ich ein kleines Testscript aus dem ich Daten auslese:
Code:
<?php header('content-type: text/html; charset=UTF-8'); ?>  
<html><body bgcolor="#FFFFFF">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<?php

 // DB Daten habe ich mal auskommentiert


$test_q= mysql_query("SELECT name from jos_test");
		$test_fetch = mysql_fetch_object($test_q);
		$test = $test_fetch -> name;
		echo "\$test=Gr&ouml;&szlig;e der B&ouml;&szlig;e<br>";
		echo "echo \$test =$test<br>";
		//$test=utf8_encode($test);
		echo "echo utf8_decode(\$test):".utf8_decode($test)."<br>";
		echo "echo htmlentities(\$test):".htmlentities($test)."<br>";
		echo "echo utf8_decode(\"gr&ouml;&szlig;e der b&ouml;&szlig;e\"):".utf8_decode("größe der böße<br>");
		echo "echo htmlentities(\"gr&ouml;&szlig;e der b&ouml;&szlig;e):".htmlentities("größe der böse")."<br>";
		echo "echo So sollts ein: Gr&ouml;&szlig;e der b&ouml;&szlig;e";

?>
</body></html>

Und so sieht die Ausgabe aus:

Code:
$test=Größe der Böße
echo $test =größe der böße
echo utf8_decode($test):grö�?e der bö�?e
echo htmlentities($test):gr�¶�Ÿe der b�¶�Ÿe
echo utf8_decode("größe der böße"):gr��e der b��e
echo htmlentities("größe der böße):gröÃ�e der böse
echo So sollts ein: Größe der böße

Bin langsam echt am Verzweifeln. Irgendwie scheint etwas mit dem server charset ODER dem DB charset nicht zu stimmen. Ich tippe auf das server charset, aber ich weiß leider nicht wie oder wo man das ändern könnte.

Ich wäre wirklich sehr sehr Dankbar, wenn da jemand eine Idee hätte woran das liegen könnte.
 
Last edited by a moderator:
Was für einen Charset nimmt dein Browser denn? Beim Firefox sieht man das unter Ansicht->Zeichenkodierung. Insbesondere kannst du da testweise einen anderen einstellen und damit die Vorgaben vom HTTP-Server und der HTML-Datei verwerfen.
 
Klar habe ich ja, aber sieht ähnlich chaotisch aus- hier zum Beispiel:
westlich ISO
Code:
$test=Größe der Böße
echo $test =größe der böße
echo utf8_decode($test):grö�e der bö�e
echo htmlentities($test):größe der böße
echo utf8_decode("größe der böße"):größe der böße
echo htmlentities("größe der böße):größe der böse
echo So sollts ein: Größe der böße

Gibt 5 verschiedene Charsets zur auswahl und bei keiner passts.
Wobei komischer weise Zeile 5 nun besser aussieht?
Aber die Daten die aus der DB kommen sehen immernoch komisch aus. /Zeile 3
 
Wobei komischer weise Zeile 5 nun besser aussieht?

Die Zeilen mit htmlentities und utf8_decode können nicht das liefern, was du gerne hättest, da die Zeichensätze zwangsweise nicht passen. Das spielt für deine Frage aber eigentlich keine Rolle.

Nachdem die Anzeige weder bei utf8 noch bei iso8859 passt, scheitert es offenbar schon beim Übertragen der Daten vom MySQL-Server. Versuche mal mit der Funktion http://de2.php.net/manual/de/function.mysql-set-charset.php den Zeichensatz zu setzen.
 
Hallo,
also dies ist zwar eine php funktion, ich hatte so etwas allerdings bereits über mysql eingebunden nur vorhin nicht angegeben.
Also hier nochmal der code:
Code:
<?php header('content-type: text/html; charset=UTF-8'); ?>  
<html><body bgcolor="#FFFFFF">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<?php

	$host = "localhost";
	$user = "joomla";
	$pass = "******";//habe ich maskiert
	$database = "joomla";
	$dz = mysql_connect($host, $user, $pass);
	mysql_select_db($database, $dz);
	//mysql_query('set character set utf8;'); 
	mysql_set_charset('utf8',$dz); 


$test_q= mysql_query("SELECT name from jos_test");
		$test_fetch = mysql_fetch_object($test_q);
		$test = $test_fetch -> name;
		echo "\$test=Gr&ouml;&szlig;e der B&ouml;&szlig;e<br>";
		echo "echo \$test =$test<br>";
		//$test=utf8_encode($test);
		echo "echo utf8_decode(\$test):".utf8_decode($test)."<br>";
		echo "echo htmlentities(\$test):".htmlentities($test)."<br>";
		echo "echo utf8_decode(\"gr&ouml;&szlig;e der b&ouml;&szlig;e\"):".utf8_decode("größe der böße<br>");
		echo "echo htmlentities(\"gr&ouml;&szlig;e der b&ouml;&szlig;e):".htmlentities("größe der böse")."<br>";
		echo "echo So sollts ein: Gr&ouml;&szlig;e der b&ouml;&szlig;e";

?>
</body></html>
Ausgabe hat sich nicht verändert:
Code:
$test=Größe der Böße
echo $test =größe der böße
echo utf8_decode($test):grö�?e der bö�?e
echo htmlentities($test):gr�¶�Ÿe der b�¶�Ÿe
echo utf8_decode("größe der böße"):gr��e der b��e
echo htmlentities("größe der böße):gröÃ�e der böse
echo So sollts ein: Größe der böße
 
Der brwoser nimmt UTF8, also das was ich eigentlich haben will. :(
Überprüfe die Request- und besonders die Response-Header. Z.B. mit Live-Headers oder Firebug im Firefox.

Mach den Insert im selben Script. Achte darauf, dass das Script im UTF8 gespeichert wird.

All das sind kleine Fehlerquellen, die vorher ausgeschlossen werden sollten.

huschi.
 
Was soll das bringen? Er hat die Ausgabe bei Verwendung von UTF-8 und ISO8859-1 doch schon gepostet. Deshalb wird es auch kaum etwas bringen, sich die Requests anzuschauen.

Stattdessen würde ich an seiner Stelle Huschis Rat, den Datensatz mal im Skript selbst hinzuzufügen, folgen.

Übrigens, dass er das Dokument in UTF-8 abgespeichert hat, erkennt man daran, dass utf8_decode beim Betrachten mit ISO8859-1 korrekt aussieht, und dazu muss die Eingabe mit sehr hoher Wahrscheinlichkeit in UTF-8 vorgelegen haben.
 
Deshalb wird es auch kaum etwas bringen, sich die Requests anzuschauen.
Dem stimme ich nicht zu.
Es könnte durchaus sein, dass der Apache immer noch einen ISO-Charset im Header übergibt. Um dies auszuschließen muss man sich den Response-Header ansehen.

Aber das ist alles nur Vermutung. Ein Link zu der Testseite würde versierten Augen schneller zur Lösung führen.

Stattdessen würde ich an seiner Stelle Huschis Rat
Dem stimme ich natürlich zu! ;)

huschi.
 
Es könnte durchaus sein, dass der Apache immer noch einen ISO-Charset im Header übergibt. Um dies auszuschließen muss man sich den Response-Header ansehen.

1. Dann müsste der Firefox aber anzeigen, dass die Seite mittels der Zeichenkodierung ISO-8859-* interpretiert wird. Wobei ich davon ausgehe, dass die Testseite direkt aufgerufen wird.

2. Dann hätte die 5.te Zeile schon bei der ersten von ihm geposteten Anzeige korrekt sein müssen.

3. Mit dem Aufruf header(...) setzt er den Charset und überschreibt damit den Defaultwert des Apachen. Der Aufruf könnte zwar fehlschlagen, dann gibt php aber in der Regel einen Fehler aus bzw. stoppt das Skript.
 
Hallo Leute,
also erstmal danke für das Interesse und die Vorschläge zu meinem Problem.
Es könnte durchaus sein, dass der Apache immer noch einen ISO-Charset im Header übergibt. Um dies auszuschließen muss man sich den Response-Header ansehen.
Ich würde das mal gerne überprüfen, allerdings weiß ich nicht so recht, wie und wo ich das überprüfen kann. Ich schätze mal irgendwo in der apache config file?
Bin leider noch etwas grün hinter den Ohren was server konfiguration angeht.
 
zu 1) Ich glaube nur was ich mit eigenen Augen sehe. Alle anderen Angeben sind gefiltert, beschnitten, etc. Eben nur die halbe Wahrheit.

Zu 2) Siehe 1.

Zu 3) Siehe 1.
Eine Fehler-Auswertung findet nicht statt und wir wissen nicht, ob es irgendwo mit geloggt wird.

Zusätzlich wissen wir rein gar nichts über die Collation der Datenbank, der Tabelle oder der Felder. Wir wissen nicht mit welchem Charset die Daten eingespeist worden sind, und vieles mehr...

Ist ja schön, wenn Du dem User volles Vertrauen entgegenbringst. Aber ich tue dies schon lange nicht mehr. ;)

PS: UPPS, war zu langsam! :D
Und jede weitere Diskussion erübrigt sich eh, solange Don83 sich nicht mehr meldet.

huschi.
 
Ich würde das mal gerne überprüfen, allerdings weiß ich nicht so recht, wie und wo ich das überprüfen kann.
Hatte ich geschrieben:
Firefox mit einer der beiden Extensions Live-Headers oder Firebug. Die können Dir den vollständigen Response-Headers anzeigen.

Aber wenn Du uns einen Link zu Deinem Test geben würdest, ginge es deutlich einfacher und schneller.

huschi.
 
Hallo, ich schicke dir mal den Link per pm, will den ungern öffentlich posten.
Wegen der DB. Also, ich bin mir nicht 100%ig sicher wie ich charset und collation der DB bestimme.
SHOW charset liefert mir eine übersicht aller charsets und show collation ...naja die collations eben.
Zu UTF8 gibts folgenden Default:
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
Wie ich das charset der DB ermittle weiß ich um ehrlich zu sein nicht und irgendwie kann ich dazu auch nichts in der mysql doku finden, bzw. lande ich immer wieder bei SHOW charset und show collation die aber nicht wirklich viel bringen.
 
zu 1) Ich glaube nur was ich mit eigenen Augen sehe. Alle anderen Angeben sind gefiltert, beschnitten, etc. Eben nur die halbe Wahrheit.

Was diese Aussage mit dem zweiten Punkt zu tun hat, kann ich nicht nachvollziehen.

Nochmals zum ersten Punkt. Die Option im Firefox überschreibt selbst die Angabe im Header des HTTP-Servers, sofern die Testseite direkt aufgerufen wird.

Zusätzlich wissen wir rein gar nichts über die Collation der Datenbank, der Tabelle oder der Felder. Wir wissen nicht mit welchem Charset die Daten eingespeist worden sind, und vieles mehr...

Genau, deshalb würde ich auch dort als nächstes nachschauen.

Ist ja schön, wenn Du dem User volles Vertrauen entgegenbringst. Aber ich tue dies schon lange nicht mehr.

Ganz im Gegenteil, die Verwendung der Befehle html_entities und utf8_decode zeigt, dass das Vertrauen fehl am Platz wäre. Deshalb darf man aber den Antworten auf konkrete Fragen Glauben schenken.
 
Back
Top