c--: Zeichencode in Zeichen konvertieren / Sonderzeichen in Form

Beitrag lesen

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()  
{  
//Beispielcode  
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()  
{  
//Return code received  
if (http.readyState == 4 && http.status == 200)  
{  
//Success  
  
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) . ';');  
}