2012-06-07 15 views
6

Estoy usando un formulario AJAX para enviar datos a otra página llamada 'show.php'. Aquí es la fuente de las páginas:Resolviendo este problema de enviar caracteres arábigos usando ajax

form.html

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<script src="ajaxsbmt.js" type="text/javascript"></script> 
</head> 
<div id="MyResult"></div> 
    <form method="POST" action="response_norma.php" name="MyForm" onsubmit="xmlhttpPost('show.php', 'MyForm', 'MyResult', '<img src=\'indicator.gif\'>'); return false;"> 
     <input type="text" name="mytext" size="20"> 
     <input type="submit" value="Submit" name="ok"> 
    </form> 
</body> 
</html> 

show.php

<?php 
    echo $_REQUEST['mytext']; 
?> 

ajaxsbmt.js

function xmlhttpPost(strURL, formname, responsediv, responsemsg) { 
    var xmlHttpReq = false; 
    var self = this; 
    // xhr for Mozilla/Safari/Ie7 
    if (window.XMLHttpRequest) { 
    self.xmlHttpReq = new XMLHttpRequest(); 
    } 
    // xhr for all other versions of IE 
    else if (window.ActiveXObject) { 
    self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    self.xmlHttpReq.open('POST', strURL, true); 
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    self.xmlHttpReq.onreadystatechange = function() { 
    if (self.xmlHttpReq.readyState == 4) { 
     // When ready, put the response into the form 
     updatepage(self.xmlHttpReq.responseText, responsediv); 
    } else { 
     // While waiting for the respnse, display a message 
     updatepage(responsemsg, responsediv); 
    } 
    } 
    self.xmlHttpReq.send(getquerystring(formname)); 
} 


function getquerystring(formname) { 
    var form = document.forms[formname]; 
    var qstr = ""; 

    function GetElemValue(name, value) { 
    qstr += (qstr.length > 0 ? "&" : "") 
      + escape(name).replace(/\+/g, "%2B") 
      + "=" 
      + escape(value ? value : "").replace(/\+/g, "%2B"); 
      ´//+ escape(value ? value : "").replace(/\n/g, "%0D"); 
    } 

    var elemArray = form.elements; 
    for (var i = 0; i < elemArray.length; i++) { 
    var element = elemArray[i]; 
    var elemType = element.type.toUpperCase(); 
    var elemName = element.name; 
    if (elemName) { 
     if (
      elemType == "TEXT" 
     || elemType == "TEXTAREA" 
     || elemType == "PASSWORD" 
     || elemType == "BUTTON" 
     || elemType == "RESET" 
     || elemType == "SUBMIT" 
     || elemType == "FILE" 
     || elemType == "IMAGE" 
     || elemType == "HIDDEN" 
    ) 
     GetElemValue(elemName, element.value); 
     else if (elemType == "CHECKBOX" && element.checked) 
     GetElemValue(elemName, element.value ? element.value : "On"); 
     else if (elemType == "RADIO" && element.checked) 
     GetElemValue(elemName, element.value); 
     else if (elemType.indexOf("SELECT") != -1) 
     for (var j = 0; j < element.options.length; j++) { 
      var option = element.options[j]; 
      if (option.selected) 
      GetElemValue(elemName, option.value ? option.value : option.text); 
     } 
    } 
    } 
    return qstr; 
} 

function updatepage(str, responsediv) { 
    document.getElementById(responsediv).innerHTML = str; 
} 

PROBLEMA

Cuando escribo caracteres en inglés en el archivo, la transferencia de datos se realiza correctamente y los recibo en la parte superior del formulario.

Pero cuando trato de escribir caracteres árabes, recibo otra información, algo así como palabras codificadas. Por ejemplo:% u0633% u0644% u0627% u0645. % u0686% u0637% u0648% u0631% u06CC en lugar de:
سلام. چطوری (si tiene fuente)

¿Cómo puedo resolver este problema?

+1

¿Tiene este error solamente con caracteres árabes o cualquier otro idioma? –

+0

Probé caracteres chinos. Los caracteres chinos también tienen este problema. – Andrew

+0

¿Has probado la solución mencionada aquí? http://stackoverflow.com/a/8274269/1446848 – exception

Respuesta

1

Lo que está sucediendo aquí es que su página está codificando los caracteres como unicode. Por ejemplo,% u0633 es el primer caracter en su cadena. Eso es normal, aunque me sorprende que esté sucediendo automáticamente.

Ahora, necesita decodificarlos cuando se muestran al espectador.

Parece que esto puede ser lo que quiere: http://www.php.net/manual/en/function.utf8-decode.php

string utf8_decode (string $data) 

Esa función toma de entrada codificada, que se parece a "% u0079" o "% u0078" y lo convierte de nuevo en letras. Cuando intenta mostrar la cadena usando PHP, envolverlo en:

utf8decode("mystring") 

Creo show.php debe verse como:

<?php 
    echo utf8decode($_REQUEST['mytext']); 
?> 
+0

Quien me votó negativamente, es amable para dar un comentario que explique por qué ... ¿Alguien más ve un problema con mi respuesta? – Lawton

1
<?php 
    $orignialmytext = $_REQUEST['mytext']; 
    $decodedmytext = urldecode($orignialmytext); 
    echo $decodedmytext; 
?> 
1

Creo que esto puede ayudar a:

self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');

El código anterior debe establecer el conjunto de caracteres de la solicitud AJAX a UTF-8.

4

Está utilizando escape() y algunos reemplazos personalizados de lujo. No hagas esto

escape() está roto y hay muy pocas razones para usarlo.

La función que está buscando se llama encodeURIComponent().

// use an array to hold the query string parts 
var qstr = []; 

qstr.appendParam = function(name, value) { 
    this.push( 
    encodeURIComponent(name) 
    + (value ? "=" + encodeURIComponent(value) : "") 
); 
    return this; 
} 
qstr.toString = function() { 
    return "?" + this.join("&"); 
} 

// use like this: 
qstr.appendParam("foo", "bar"); 
qstr.appendParam("arabic", "سلام. چطوری"); 

// now make a real query string. 
qstr.toString() // "?foo=bar&arabic=%D8%B3%D9%84%D8%A7%D9%85.%20%DA%86%D8%B7%D9%88%D8%B1%DB%8C" 

Lo anterior debe reemplazar su función GetElemValue(). Tenga en cuenta cómo puede ajustar los objetos agregando las funciones que necesita (como appendParam()) o sobreescribiendo funciones que ya están allí (como toString()).

También tenga en cuenta que puede devolver la matriz desde su función getquerystring(). Llamadas JavaScript toString() automáticamente en situaciones como esta:

var url = "http://bla/" + qstr 

Desde toString() se anula lo correcto va a suceder.