Aufgabe

Es muss via Flashvar eine URL an ein Flash übergeben werden, welches diese dann aufrufen und die Daten nutzen soll.

Problem

Die Flashvars bestehen auf einer Aneinanderreihung von {key}={value} Parametern (verknüpft mit dem &). Dabei muss {value} komplett urlencodiert sein. Also die gesamte URL als solche. Das Flash wiederum liest den Parameter ein, decodiert(!) den entsprechenden Flashvar-Parametern und führt ihn dann aus. Dazu kommt, dass die Javascript-Funktionen escape() u.a. nicht ausreichend genug sind, um alle Zeichen zu kodieren. Tests mit * oder + führen schweren Fehlern, bzw. zu veränderten Parametern.

Lösung

Das erste Geheimnis ist simpel, aber wichtig. Die Kodierung muss zweimal angewendet werden. Das erste Mal für jeden Parameter der eigentlichen URL (ich gehe mal davon aus, das die Parameterschlüssel immer gültig gewählt sind) und das zweite Mal für die gesamte URL. Damit erhält das Flash nach der ersten Rückumwandlung der Flashvar immer noch eine URL, wo alle Inhalte kodiert sind.

Das zweite Geheimnis ist nicht ganz so trivial, allerdings gibt es auch hierzu Lösungen. Im Internet findet sich eine nette Gegenüberstellung der Methoden escape, encodeURI und encodeURIComponent. Kurzes Fazit: escape < encodeURIComponent. Aber auch letztere wandelt einige Zeichen nicht um, die bei der Verwendung mit Flash Probleme machen. Diese Zeichen (~!*()') und das + müssen daher noch händisch kodiert werden.

function escapeAdvanced(s) {
	var r = encodeURIComponent(s);

	var replacements = {
		'~': '%7E',
		'+': '%2B',
		'!': '%21',
		'*': '%2A',
		'(': '%28',
		')': '%29',
		"'": '%27'
	};

	for (s in replacements) {
		if (replacements.hasOwnProperty(s)) {
			r = r.replace(s, replacements[s]);
		}
	}

	return r;
}

Für schönere Lösungen bin ich jederzeit offen 😉

Update: Mit UTF8 hat das ganze allerdings Probleme; wäre ja auch zu schön gewesen.