Codierung: Mein mp3-player versteht mich nicht
Linuchs
- sonstiges
0 Felix Riesterer
Hallo,
sitze jetzt schon fast zwei Stunden an einem Problem und bekomme es nicht gelöst.
Einem mp3-Player möchte ich per XML-Datei mitteilen, er möge bitte dieses Lied spielen:
http://www.shanty-chor-kieler-foerde.de/Kieler Förde.mp3
Genauso, mit Leerzeichen und Umlaut, steht es UTF8-codiert in der Datenbank. Verschiedene Umcodierungen ergeben dieses in der XML-Datei:
,'[url]' => urlencode($row['url'])
http%3A%2F%2Fwww.shanty-chor-kieler-foerde.de%2FKieler+F%C3%B6rde.mp3
,'[url]' => urlencode(utf8\_decode($row['url']))
http%3A%2F%2Fwww.shanty-chor-kieler-foerde.de%2FKieler+F%F6rde.mp3
,'[url]' => utf8_decode($row['url'])
http://www.shanty-chor-kieler-foerde.de/Kieler F.mp3
,'[url]' => str_replace(' ','%20',$row['url'])
http://www.shanty-chor-kieler-foerde.de/Kieler%20Förde.mp3
Keines der vier Ergebnisse kann der Player abspielen.
Lt. php-Programm (auch im UTF8 Umfeld) ist die Datei erreichbar:
$url = str_replace(' ','%20',$row['url']);
echo "url=[".$url."]<br>";
(Anzeige: url=[http://www.shanty-chor-kieler-foerde.de/Kieler%20Förde.mp3])
if ( $test_handle = @fopen( $url, 'rb' ))
Linuchs
Lieber Linuchs,
du hast nicht kontext-gerecht enkodiert! Schauen wir uns Dein Datum (die URL) genauer an:
http://www.shanty-chor-kieler-foerde.de/Kieler Förde.mp3
Das Protokoll (http), die Abtrennung desselben vom Domain-Namen (://), die Subdomain (www), die Abtrennung der einzelnen Subdomains (.), die Hauptdomain (shanty-chor-kieler-foerde), die Abtrennung von der Top-Level-Domain (.), die Top-Level-Domain (de) und den Beginn des "lokalen Pfads" (/).
Alles obige betrifft die Adressierung des Zielrechners und ist bereits korrekt enkodiert:
http://www.shanty-chor-kieler-foerde.de/
Dieser Bestandteil der "Adresse" benötigt also keine Behandlung mit urlencode(). Das ist wichtig!
Nun schauen wir uns den lokalen Pfad auf dem Zielserver an:
/Kieler Förde.mp3
Jetzt wird es interessant! Dateinamen müssen mit urlencode() oder rawurlencode() behandelt werden, die Trennzeichen zwischen den verschiedenen Verzeichnis- oder Dateiamen dagegen nicht!
Im Ergebnis müsstest Du also notieren:
$url = array(
'host' => preg_split('~^(https?://[^/]+/).*~', '$1', $row['url']),
'path' => ''
);
// Pfad an den Trennzeichen auftrennen...
$url['path'] = explode('/', str_replace($url['host'], '', $row['url']));
// ... und jeden Teil URL-enkodieren
foreach ($url['path'] as $i => $name) {
$url['path'][$i] = urlencode($name);
}
$url_encoded = $url['host'].implode('/', $url['path']);
Wahrscheinlich werden nun auch die Punkte im Dateinamen enkodiert - keine Ahnung ob das stört...
Liebe Grüße,
Felix Riesterer.
Tach!
du hast nicht kontext-gerecht enkodiert!
"Kodiert" wäre das richtige Wort gewesen, Herr Englischlehrer! ;-)
Im Ergebnis müsstest Du also notieren:
[code lang=php]$url = array(
'host' => preg_split('~^(https?://[^/]+/).*~', '$1', $row['url']),
'path' => ''
);
Er kann auch die Funktion parse_url() nehmen.
Wahrscheinlich werden nun auch die Punkte im Dateinamen enkodiert - keine Ahnung ob das stört...
Nö, die bleiben unberührt.
Ansonsten wäre noch zu sagen, die Default-Kodierung für XML-Dateien ist UTF-8. (Die kontextgerechte Behandlung der URL-Werte kommt anschließend noch hinzu.) Und gern wird auch vergessen, mit dem DBMS auszuhandeln, in welcher Kodierung die Daten geliefert werden sollen (für MySQL).
dedlfix.
Lieber dedlfix,
"Kodiert" wäre das richtige Wort gewesen, Herr Englischlehrer! ;-)
kriegst trotzdem ein "fachlich hilfreich" spendiert. ;-) Der Hinweis auf die Zeichenkodierung (UTF-8), ebenso wie der Hinweis, dass man MySQL sagen kann, in welcher Kodierung man es gerne hätte, waren einfach "fachlich hilfreich". Das mit parse_url habe ich nicht auf dem Radar, da ich es nie (höchstens einmal) verwendet habe...
Liebe Grüße,
Felix Riesterer.
Lieber Felix,
danke für deine Codierung.In der XML-Datei steht danach
<?xml version="1.0" encoding="utf-8"?>
<player autoStart="no" showPlaylist="yes" showDisplay="yes" skinColor="">
<song path="http%3A//www.shanty-chor-kieler-foerde.de/Kieler+F%C3%B6rde.mp3" title="Kieler Förde - Shanty-Chor „Kieler Förde'" />
</player>
Der PLayer spielt das nicht. Ich habe den Verdacht, dass der Player keine Umlaute in der URL versteht. Habe deine Idee von der Auftrennung des Strings aufgegriffen und dieses versucht:
$arr_a = explode('//',$row['url']);
$url_encoded = $arr_a[0]."/";
$arr_b = explode('/',$arr_a[1]);
foreach($arr_b AS $i => $name) {
$url_encoded .= "/".str_replace(' ','+',utf8_decode($name));
}
echo "[".$url_encoded."]<br>";
Beim Anschauen der XML-Datei mit dem Notepad++ steht anstelle des ö ein markiertes xF6, aber der Unterstrich, der eine URL markiert, hört davor auf. Auch Notepad kömmt also mit dem Umlaut in der URL nicht klar. Mit Leerzeichen übrigens auch nicht.
Linuchs
Hallo,
<?xml version="1.0" encoding="utf-8"?>
<player autoStart="no" showPlaylist="yes" showDisplay="yes" skinColor="">
<song path="http%3A//www.shanty-chor-kieler-foerde.de/Kieler+F%C3%B6rde.mp3" title="Kieler Förde - Shanty-Chor „Kieler Förde'" />
</player>
das ist schon kaputt. Warum ist der Doppelpunkt nach "http" maskiert?
> Der PLayer spielt das nicht.
Würde ich auch nicht. ;-)
> Ich habe den Verdacht, dass der Player keine Umlaute in der URL versteht.
Das glaube ich nicht, aber ob es daran liegt, kannst du ja leicht mit einem Gegenbeispiel ohne Umlaute ausprobieren. Interessant ist hier höchstens, ob im Dateisystem des Servers UTF-8 verwendet wird (dann wäre %C3%B6 richtig), oder irgendeine ISO-Codierung mit nur einem Byte pro Zeichen (dann wäre %F6 zu verwenden).
> ~~~php
$arr_a = explode('//',$row['url']);
> $url_encoded = $arr_a[0]."/";
> $arr_b = explode('/',$arr_a[1]);
> foreach($arr_b AS $i => $name) {
> $url_encoded .= "/".str_replace(' ','+',utf8_decode($name));
> }
> echo "[".$url_encoded."]<br>";
Sehr eigenartig. Du trennst erst das Präfix "http:" ab, machst daraus "http:/" und splittest den Rest nochmal an jedem '/' auf. Dann setzt du die Teile wieder zusammen - wozu hier das utf8_decode()?
Außerdem kann ich hier nichts entdecken, was "http:" zu "http%3A" entstellt.
Beim Anschauen der XML-Datei mit dem Notepad++ steht anstelle des ö ein markiertes xF6
Also geht NP++ davon aus, die Datei sei in UTF-8 codiert (was für XML auch Standard ist), das ö ist aber in Wirklichkeit in ISO-Latin codiert. Daran dürfte das IMO unlogische utf8_decode() schuld sein.
aber der Unterstrich, der eine URL markiert, hört davor auf. Auch Notepad kömmt also mit dem Umlaut in der URL nicht klar. Mit Leerzeichen übrigens auch nicht.
Nein. NP++ erklärt die URL da als beendet, wo ein illegales Zeichen auftritt. Das ist im einen Fall eine Bytesequenz, die in UTF-8 nicht vorkommen darf (ein einzelnes 0xF6), andererseits ein Leerzeichen.
Das Leerzeichen muss in URLs als '+' (im Query-String) oder als %20 codiert werden (wobei %20 im Query-String nach meiner Erfahrung auch funktioniert).
So long,
Martin