Hallo,
Zum trennen von Werte verwende ich unter anderem die zeichen §§§
warum ein so "ausgefallenes" Symbol?
Und genau dieses macht mir jetzt plötzlich Probleme. Ich weiss nicht genau warum. Vermutlich weil ich meine ganze Applikation auf UTF-8 umgestellt habe?
Gut möglich. Das Symbol "§" hat den Code U+00A7, wird also in UTF-8 durch zwei Bytes dargestellt. Solange du ausschließlich in der Javascript-Welt bleibst, spielt das keine Rolle; Javascript arbeitet intern mit Unicode, unabhängig von der verwendeten Zeichencodierung.
Wenn aber -so wie es der nachfolgende Codeausschnitt zeigt- PHP ins Spiel kommt, kann's lustig werden, weil PHP nur in ein paar wenigen Funktionen auf die Problematik mit Mehrbyte-Codierungen eingeht.
foreach ($_COOKIE['ServiceID'] as $name => $value) {
echo "$name : $value <br />\n";
$allproperties = explode("§§§",$value);
...
}
> das echo für die Zeichen $$$ ist nun im Browser ???.
Wo kommen jetzt noch die Dollarzeichen her? Und vor allem: Die müssten völlig unproblematisch sein, sie liegen mit Code U+0024 innerhalb des ASCII-Bereichs, der in allen gängigen Codierungen identisch dargestellt wird (UTF-16 nicht, aber das ist auch eher selten).
Das PHP-Script, das diese "Verarbeitung" und Ausgabe macht, ist vermutlich nicht in UTF-8 codiert. Damit sind die "§§§" als Bytefolge A7,A7,A7 codiert, der Client sendet aber die gleichen Zeichen in UTF-8, das ergibt die Bytefolge C2,A7,C2,A7,C2,A7. Ergo: Keine Übereinstimmung.
> Daher funktioniert auch das explode (explode("§§§",$value)) nicht mehr.
Eben.
Eine Darstellung als "???" ist übrigens ein Hilfeschrei des Browsers (oder einer anderen Instanz) beim Interpretieren von fehlerhaften UTF-8-Sequenzen. Das Byte A7 darf in UTF-8 nur als zweites (drittes, ...) Byte einer Mehrbyte-Sequenz auftreten. Einzeln ist es ungültig.
> if (document.forms[0].sel\_serviceproperties.options[i].selected == true)
Nur mal so nebenbei: Einen Wert, der schon als Boolean vorliegt, durch einen expliziten Vergleích nochmal in Boolean umzuwandeln, ist unnötig. Ein einfaches
> if (...options[i].selected)
genügt und ist leichter zu lesen und zu verstehen.
> Kann mir jemand einen heissen Tipp geben?
\* Codiere alles in UTF-8, auch die PHP-Scripte
\* Vermeide problematische Zeichen in wichtigen Positionen
So long,
Martin
--
Keine Sorge, wir finden für jede Lösung ein Problem.