Charset Konvertierung (utf8, ISO-8859-1)

andy72

Erfahrenes Mitglied
Hallo @all,

habe folgendes Problem:
Wenn ich eine HTML-Datei mit cUrl abhole, kann diese ja in einem Zeichensatz codiert sein (UTF-8, ISO-8859-1 etc).
Meine eigene Seite gibt grundsätzlich UTF-8 aus, um kompatibel zu sein - nun meine Frage: Kann man mit irgendeiner PHP Funktion erkennen, in welchem Charset sich meine abgeholten daten befinden ? Eine Rück-/Umkonvertierung habe ich bereits, jedoch muss ich vorher wissen, wie die Daten codiert sind.

LG
Andy
 
Das Sicherste ist die Angabe im HTTP-Header auszuwerten. Diesen erhältst du, indem CURLOPT_HEADER aktiviert wird.
 
Hm,laut RFC ist diese Angabe im Header aber nicht zwingend notwendig bzw ist Default UTF-8. Was aber, wenn die Angabe fehlt und die Datei zB ISO-8859-15 ist ?

im Moment mache ich das so:
PHP:
if( mb_check_encoding($tmp, "UTF-8") == false)
  $description = utf8_encode($tmp);
else
  $description = $tmp;
Das Problem hierbei ist aber, wenn die Daten bereits ANDERS codiert sind, zB Japanisch oder so - ich müsste ja Japanisch umkodieren, um das dann nach UTF-8 zu codieren, oder ?
Ich hab @home sowie auch auf meinem Server im Inet mbstring zur verfügung, viellt. kann man da was machen ?
 
Meine Güte,ich denke viel zu kompiliziert - Die Lösung:
PHP:
$description = htmlentities($tmp, ENT_QUOTES, "UTF-8");
$description = urlencode($description);

Ich hatte nur das Problem, dass ich die Daten in ein XML einbringen musste (auch UTF-8 Codiert) und dann im JS (AJAX) wieder auslesen musste - es lag doch Tatsache am urlencode() :D

Danke trotzdem für die Hilfe :)
LG
Andy
 
Diese Lösung berücksichtigt aber nicht den Fall, dass der Inhalt einen anderen Zeichenkodierung als UTF-8 (beziehungsweise einen anderen Zeichensatz als Unicode) verwendet.
Wenn du mit UTF-8 arbeitest und damit Unicode als Zeichensatz hast, reicht auch die htmlspecialchars()-Funktion, da die anderen Nicht-Metazeichen auch direkt kodiert werden können, da sie ja im Unicode-Zeichensatz enthalten sind.
 
hmmmmm ...

mit "htmlentities($tmp, ENT_QUOTES, "UTF-8")" wird doch aber nach UTF-8 codiert - ich hab das getestet, was passiert, wenn der Zeichensatz in $tmp zB ISO-8859-15 ist, und raus kommt dann trotzdem UTF-8. Gut, wenn $tmp dann JP ist, hab ich ein Problem, aber ich vermute/hoffe/denke, das auf meinem Portal, wo ich dran arbeite nicht gerade Japanische Inhalte angezeigt werden sollen / müssen.
Wenn Du jedoch eine passable andere Lösung hast, würde ich das gerne ändern, um auch dafür gewappnet zu sein :)
 
Der dritte Parameter beschreibt nur den zugrundelegenden Zeichensatz beziehungsweise die zugrundelegende Zeichenkodierung, die zur Konvertierung der Zeichen, die durch benannte Zeichenreferenzen (character entity reference) dargestellt werden können, verwendet werden soll.
In deinem Fall bedeutet das, dass alle UTF-8-kodierte Zeichen, die durch eine benannte Zeichenreferenz dargestellt werden können, durch diese ersetzt werden.

Zur Verdeutlichung:
PHP:
$str = "f\xF6\xF6b\xE4r"; // entspricht im ISO-8859-1-Zeichensatz "fööbär"
var_dump(htmlentities($str, ENT_QUOTES, "ISO-8859-1"));
var_dump(htmlentities($str, ENT_QUOTES, "ISO-8859-15"));
var_dump(htmlentities($str, ENT_QUOTES, "UTF-8"));
var_dump(htmlentities(utf8_encode($str), ENT_QUOTES, "UTF-8"));
 
Zurück