2012-06-07 14 views
6

Używam formularza AJAX w celu wysłania danych do innej strony o nazwie "show.php". Oto źródło strony:Rozwiązywanie problemu z wysyłaniem znaków arabskich za pomocą ajaxu

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; 
} 

PROBLEMY

Po wpisaniu angielskich znaków w pliku, przesyłanie danych przebiega pomyślnie i otrzymuję je na górze formularza.

Ale kiedy próbuję wpisać arabskie znaki, otrzymuję inne dane, takie jak zakodowane słowa. np .:% u0633% u0644% u0627% u0645. % u0686% u0637% u0648% u0631% u06CC zamiast:
سلام. چطوری (jeśli masz czcionkę.)

Jak mogę rozwiązać ten problem?

+1

Czy masz ten błąd tylko z arabskimi znakami lub z każdym innym językiem? –

+0

Próbowałem chińskich znaków. Chińskie znaki również mają ten problem. – Andrew

+0

Czy już wypróbowałeś rozwiązanie wymienione tutaj? http://stackoverflow.com/a/8274269/1446848 – exception

Odpowiedz

1

Co się tutaj dzieje, to Twoja strona koduje znaki jako kod Unicode. Na przykład% u0633 jest pierwszym znakiem w twoim ciągu. To normalne, chociaż jestem zaskoczony, że dzieje się to automatycznie.

Teraz należy je zdekodować podczas wyświetlania w przeglądarce.

Wygląda na to może być to, co chcesz: http://www.php.net/manual/en/function.utf8-decode.php

string utf8_decode (string $data) 

To funkcja przyjmuje zakodowany wkład, który wygląda jak „% u0079” lub „% u0078” i zamienia go z powrotem do listów. Podczas próby wyświetlenia ciąg PHP, zawinąć go w:

utf8decode("mystring") 

myślę show.php powinna wyglądać następująco:

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

Ktokolwiek mnie zniechęcił, jest grzeczny, aby dać komentarz wyjaśniający dlaczego ... Czy ktoś inny widzi problem z moją odpowiedzią? – Lawton

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

myślę, że może to pomóc:

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

Powyższy kod powinien ustawić zestaw znaków żądania AJAX dla UTF-8.

4

Używasz escape() i niektórych niestandardowych zamienników. Nie rób tego.

escape() jest uszkodzony i nie ma powodu, aby go używać.

Funkcja, której szukasz, nazywa się 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" 

Powyższe powinno zastąpić twoją funkcję GetElemValue(). Zwróć uwagę, w jaki sposób możesz modyfikować obiekty, dodając potrzebne funkcje (takie jak appendParam()) lub zastępując funkcje, które już tam są (np. toString()).

Pamiętaj też, że możesz zwrócić samą tablicę ze swojej funkcji getquerystring(). wzywa JavaScript toString() automatycznie w sytuacjach takich jak ta:

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

Od toString() jest przesłonięta, słuszne będzie się działo.

Powiązane problemy