Hallo,
ich habe wohl ein digitales Brett vorm Kopf und bitte um Hilfe...
Es geht um eine Webseite, die über POST (XMLHttpRequest/Ajax) den Inhalt einer textarea an ein PHP-Script schicken soll. Das PHP-Script soll dann damit weiterarbeiten, im Moment lasse ich mir damit die empfangenen Daten anzeigen - um zu sehen, was ankommt.
Die textarea kann alle möglichen Sonderzeichen enthalten - Anführungszeichen, Fragezeichen, Umlaute, auch asiatische Zeichen sollen funktionieren.
Als erstes habe ich dabei einfach mein JavaScript den value aus der textarea rausholen lassen, diesen mit escape() verschlüsselt (es darf ja kein & enthalten sein) und als einen (von mehreren) Parametern an die Funktion SendData (siehe unten) gegeben.
Dies habe ich mal in der Funktion SendText() vereinfacht nachgebaut.
Mein PHP-Script hat diesen Parameter mit $_Request['...'] entgegengenommen. Ein Entschlüsseln war nicht mehr nötig, da der String dann schon automatisch entschlüsselt war - ein Leerzeichen, das das JavaScript mit escape() in ein %20 verwandelt hatte, wird mit $_Request im PHP-Script gleich als Leerzeichen empfangen.
Das funktioniert auch mit Umlauten, nicht aber mit Anführungszeichen - diese werden von PHP seltsamerweise als " empfangen, also so, wie man sie in PHP escapen müsste ($str = """), obwohl der escape-Aufruf in JavaScript vor dem Senden der Daten eigentlich ein %22 daraus gemacht hat.
Beispiel:
In der textarea steht:
$main = "
JavaScript escaped daraus:
%24main%20%3D%20%22
Dies wird über SendData() ans PHP-Script geschickt, welches empfängt:
$main = "
Woher kommt der Backslash?
Also habe ich anders versucht, Daten bzw. Sonderzeichen von JavaScript zu PHP zu übertragen - ich habe in JavaScript eine Funktion (encode2) geschrieben, die jedes Zeichen mit seinem Zeichencode ausgibt, getrennt von einem Punkt. Dieser String wird dann vom PHP-Script decodiert (decode2).
Und dies funktioniert bei Umlauten nicht. Ein mb_ord("ä") gibt mir zwar 228 aus, aber ein mb_chr(228) oder ein mb_chr(mb_ord("ä")) gibt ä (2 Zeichen!) aus.
Offensichtlich funktioniert also die Funktion mb_chr() nicht zuverlässig.
Wie kann ich also zuverlässig in PHP einen Zeichencode in das entsprechende Zeichen konvertieren, sodass ich also aus 228 ein ä erhalte?
Ich bin für jeden Tipp dankbar.
Hier die angesprochenen Funktionen:
function SendText()
{
var txt = document.getElementById('mytextarea').value;
var dat = "par1=" + par1 + "&par2=" + par2 + "&txt=" + escape(txt);
SendData("php.php", dat);
}
function SendData(url, params)
{
var http = new XMLHttpRequest();
http.open("POST", url, true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
http.onreadystatechange = function()
{
if (http.readyState == 4 && http.status == 200)
{
returncode = http.responseText;
}
http.send(params);
}
function encode2(input)
{
buf = "";
for (i = 0; i < input.length; i++)
{
if (buf != "") buf = buf + ".";
buf = buf + input.charCodeAt(i);
}
function decode2($input)
{
$buf = "";
$arr = explode(".", $input);
for ($i = 0, $size = sizeof($arr); $i < $size; $i++)
{
if ($arr[$i] != "") $buf .= mb_chr($arr[$i]);
}
return $buf;
}
function mb_html_entity_decode($string)
{
if (extension_loaded('mbstring') === true)
{
mb_language('Neutral');
mb_internal_encoding('UTF-8');
mb_detect_order(array('UTF-8', 'ISO-8859-15', 'ISO-8859-1', 'ASCII'));
return mb_convert_encoding($string, 'UTF-8', 'HTML-ENTITIES');
}
return html_entity_decode($string, ENT_COMPAT, 'UTF-8');
}
function mb_ord($string)
{
if (extension_loaded('mbstring') === true)
{
mb_language('Neutral');
mb_internal_encoding('UTF-8');
mb_detect_order(array('UTF-8', 'ISO-8859-15', 'ISO-8859-1', 'ASCII'));
$result = unpack('N', mb_convert_encoding($string, 'UCS-4BE', 'UTF-8'));
if (is_array($result) === true)
{
return $result[1];
}
}
return ord($string);
}
function mb_chr($string)
{
return mb_html_entity_decode('&#' . intval($string) . ';');
}