要解决这个问题,发送使用AJAX阿拉伯语字符 [英] Solving this issue of sending arabic characters using ajax

查看:162
本文介绍了要解决这个问题,发送使用AJAX阿拉伯语字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为了将数据发送到另一个名为show.php页面使用AJAX的形式。 这里是页面的源:

I'm using an AJAX form in order to send data to another page named 'show.php'. Here is the source of pages:

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

问题

当我键入提起,数据传输英文字符成功,我接受他们的形式之上。

When I type English characters in the filed, data transfer successfully and I receive them top of the form.

但是,当我尝试键入阿拉伯字符,我收到另外一个数据,像EN codeD的话。例如:%u0633%u0644%u0627%u0645。 %u0686%u0637%u0648%u0631%u06CC代替:
 سلام。 چطوری (如果你有字体。)

But when I try to type Arabic characters, I receive another data, something like encoded words. e.g: %u0633%u0644%u0627%u0645. %u0686%u0637%u0648%u0631%u06CC instead of:
سلام. چطوری (if you have font.)

我该如何解决这个问题呢?

How can I solve this problem?

推荐答案

您使用的是越狱()和一些花哨的自定义更换。不这样做。

You're using escape() and some fancy custom replacements. Don't do this.

越狱()被打破,有很少的理由来使用它。

escape() is broken and there is very little reason to use it.

您要查找的功能称为连接codeURIComponent()

// 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"

以上应更换你的 GetElemValue()功能。请注意如何您可以通过添加你需要的功能(如 appendParam())或压倒一切的功能,这些功能已经存在(如的toString())。

The above should replace your GetElemValue() function. Note how you can tweak objects by adding functions you need (like appendParam()) or overriding functions that are already there (like toString()).

另外请注意,你可以从你的函数返回数组本身 getquerystring()。在这样的情况下调用JavaScript 的toString()自动:

Also note that you can return the array itself from your function getquerystring(). JavaScript calls toString() automatically in situations like this:

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

由于的toString()被覆盖,正确的事情会发生。

Since toString() is overridden, the right thing will happen.

这篇关于要解决这个问题,发送使用AJAX阿拉伯语字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆