Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

oixio

Senior Schreiberling

  • "oixio" is male
  • "oixio" started this thread

Posts: 517

Date of registration: Oct 3rd 2004

1

Tuesday, August 30th 2005, 12:57pm

XML UTF-8 umformen mit PHP - Sonderzeichen?

Hallo,

ich habe folgendes Problem:

Ich möchte eine XML-Datei (erzeugt aus den Firefox-Bookmarks, codiert in UTF-8 ) mit PHP in eine HTML-Seite umwandeln. Nur bekomme ich da dann hinterher die Sonderzeichen nicht vernünftig angezeigt.

Ich habe in PHP folgendes gesetzt (obwohl der das eigentlich einfach aus der Quelle übernehmen sollte):
[php]xml_parser_set_option($this->xml_parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');[/php]

und auch in dem HTML-Gerüst drum herum habe ich am Anfang auf UTF-8 gestellt:
[php]print("<HTML>
<HEAD>
<TITLE>Bookmarks</TITLE>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");[/php]

In der fertigen Ausgabe zeigt mir der Firefox aber folgendes an:
zb statt Etechnik - Übungen, sehe ich E-Technik - Übungen

Hat schon mal jemand mit dem PHP-XMLParser gearbeitet und kann mir sagen was ich falsch mach oder übersehen hab?


oixio

PS: Ja ich weiss ich könnt das auch mit einer XSL machen, aber nicht jeder Browser unterstützt das und außerdem hab ich so weniger Traffic, da nicht jedes mal die komplette 500kb XBEL.xml übertragen werden muss.
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

2

Tuesday, August 30th 2005, 2:04pm

RE: XML UTF-8 umformen mit PHP - Sonderzeichen?

Quoted

Original von oixio
und auch in dem HTML-Gerüst drum herum habe ich am Anfang auf UTF-8 gestellt:
[php]print("<HTML>
<HEAD>
<TITLE>Bookmarks</TITLE>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");[/php]

In der fertigen Ausgabe zeigt mir der Firefox aber folgendes an:
zb statt Etechnik - Übungen, sehe ich E-Technik - Übungen
Welchen Content-Type liefert der Webserver denn im HTTP-Header? (Das läßt sich beispielsweise mit http://web-sniffer.net/ prüfen.)
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

oixio

Senior Schreiberling

  • "oixio" is male
  • "oixio" started this thread

Posts: 517

Date of registration: Oct 3rd 2004

3

Tuesday, August 30th 2005, 2:37pm

Hallo Joachim,

ich nehme mal an du meinst folgende Zeile:

Quoted

HTTP Response Header
...
Content-Type: text/html; charset=ISO-8859-1


Das beißt sich ja nen bischen. Meinst du es hilft wenn ich alles auf iso umstelle? Ich werds mal ausprobieren. Oder hat wer ne Idee wie ich zu UTF-8 komm?

oixio


Edit: Ich habs mal in den obigen Zeilen auf "iso-8859-1" umgestellt. Ergebnis sieht dann so aus:
E-Technik - Ãœbungen

Also anders codiert aber immer noch nicht lesbar.
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

This post has been edited 1 times, last edit by "oixio" (Aug 30th 2005, 2:40pm)


  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

4

Tuesday, August 30th 2005, 2:45pm

Quoted

Original von oixio
ich nehme mal an du meinst folgende Zeile:

Quoted

HTTP Response Header
...
Content-Type: text/html; charset=ISO-8859-1


Das beißt sich ja nen bischen. Meinst du es hilft wenn ich alles auf iso umstelle? Ich werds mal ausprobieren. Oder hat wer ne Idee wie ich zu UTF-8 komm?
Dein Dokument wird so wie Du es beschrieben hast in UTF-8 kodiert. Demnach mußt Du dem Browser auch sagen, daß es sich um UTF-8 handelt, denn zuverlässig automatisch erkennbar ist das nicht.

Kurz gesagt: Alles auf UTF-8 setzen, insbesondere den HTTP-Content-Type-Header. Die Charset-Angabe über das Meta-Element in Deinem Dokument kannst Du Dir übrigens komplett sparen, das ist eine ziemlich schmutzige Krücke.
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

oixio

Senior Schreiberling

  • "oixio" is male
  • "oixio" started this thread

Posts: 517

Date of registration: Oct 3rd 2004

5

Tuesday, August 30th 2005, 4:09pm

So ich hab nun alles auf UTF-8 umgestelt auch per [php]header('Content-type: text/html; charset=UTF-8'); [/php] den Header entsprechend geändert.
Nur ging es dann immer noch nicht. Dann ist mir beim lesen der Api aber noch was aufgefallen. Man kann dem Parser beim Erstellen übergeben, welche Codieerung er benutzen soll (zB für die XML-Datei, die er einliest). Ich hatte gelesen, dass dieser bei PHP intern immer UTF-8 benutzt und die Quellencodierung automatisch anhand des ersten Tags bestimmt. Hier in diesem fall ist das

Source code

1
<?xml version="1.0" encoding="UTF-8"?>
und habe ihm nichts übergeben, damit er dei Defaultwerte nutzt. Hatte er aber wohl nicht. Ich übergebe ihm jetzt gleich am Anfang mit[php]xml_parser_create('UTF-8');[/php] dass er UTF-8 benutzen soll und nun funktioniert es auch alles bestens.

Danke für die Hilfe,
oixio
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

6

Tuesday, August 30th 2005, 7:20pm

Quoted

Original von oixio
Dann ist mir beim lesen der Api aber noch was aufgefallen. Man kann dem Parser beim Erstellen übergeben, welche Codieerung er benutzen soll (zB für die XML-Datei, die er einliest). Ich hatte gelesen, dass dieser bei PHP intern immer UTF-8 benutzt und die Quellencodierung automatisch anhand des ersten Tags bestimmt. Hier in diesem fall ist das

Source code

1
<?xml version="1.0" encoding="UTF-8"?>
und habe ihm nichts übergeben, damit er dei Defaultwerte nutzt.
Das ist verwunderlich. Kann es eventuell sein, daß Du die Datei per HTTP-Request eingelesen hast und der Webserver die in der Datei angegebene Kodierung mit einer anderen im HTTP-Header überschrieben hat? Falls nein, dann ist entweder der PHP-XML-Parser buggy oder Du hast noch etwas anderes übersehen ...
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

oixio

Senior Schreiberling

  • "oixio" is male
  • "oixio" started this thread

Posts: 517

Date of registration: Oct 3rd 2004

7

Tuesday, August 30th 2005, 10:45pm

Also ich les das so ein (Codeauszug):

[php]
$this->xml_parser = xml_parser_create('UTF-8');

xml_set_object($this->xml_parser, &$this);
// use case-folding so we are sure to find the tag in $map_array
xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_parser_set_option($this->xml_parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
xml_set_element_handler($this->xml_parser, "startElement", "endElement");
xml_set_character_data_handler($this->xml_parser, "characterData");
$xmldata = implode("", file($this->xml_file));
if (!xml_parse($this->xml_parser, $xmldata)) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($this->xml_parser)),
xml_get_current_line_number($this->xml_parser)));
}[/php]
Dazu kommen dann halt noch die Funktionen für Open- und End-tag. Auf jeden fall funktioniert es jetzt und erstmal bin ich damit zufrieden, auch wenn ich gerne wüsste, woran es lag.

mfg
oixio
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

8

Wednesday, August 31st 2005, 5:57pm

Quoted

Original von oixio
Also ich les das so ein (Codeauszug):

[php]
$this->xml_parser = xml_parser_create('UTF-8');
[/php]
Dazu kommen dann halt noch die Funktionen für Open- und End-tag. Auf jeden fall funktioniert es jetzt und erstmal bin ich damit zufrieden, auch wenn ich gerne wüsste, woran es lag.
Ist wohl genau das Problem, was Du auch nanntest: der optionale Parameter von xml_parser_create.

Zitat aus der API-Dokumentation:

Quoted

The optional encoding specifies the character encoding for the input/output in PHP 4. Starting from PHP 5, the input encoding is automatically detected, so that the encoding parameter specifies only the output encoding. In PHP 4, the default output encoding is the same as the input charset. If empty string is passed, the parser attempts to identify which encoding the document is encoded in by looking at the heading 3 or 4 bytes.


In meinen Augen ein völlig beklopptes Verhalten, aus den ersten drei oder vier Bytes die Kodierung erraten zu wollen. In XML-Dokumenten ist die Deklaration der Kodierung bereits im Dokument enthalten, warum wird diese also nicht ausgelesen? Da waren ja offenbar wieder Fachleute am Werk ...
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

This post has been edited 2 times, last edit by "Joachim" (Aug 31st 2005, 5:58pm)