6

「show.php」という名前の別のページにデータを送信するために、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;
}

問題

フィールドに英字を入力すると、データが正常に転送され、フォームの先頭に表示されます。

しかし、アラビア文字を入力しようとすると、エンコードされた単語のような別のデータが表示されます。例: %u0633%u0644%u0627%u0645。%u0686%u0637%u0648%u0631%u06CC の代わりに: スラーマ
. چطوری (フォントをお持ちの場合)

どうすればこの問題を解決できますか?

4

4 に答える 4

6

あなたはescape()いくつかの派手なカスタム置換を使用しています。これをしないでください。

escape()壊れており、使用する理由はほとんどありません。

探している関数は と呼ばれ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"

上記はGetElemValue()関数を置き換える必要があります。appendParam()必要な関数を追加する ( など)、または既に存在する関数をオーバーライドする ( など)ことによって、オブジェクトを調整する方法に注意してくださいtoString()

関数から配列自体を返すこともできますgetquerystring()。次のような状況では、 JavaScript がtoString()自動的に呼び出されます。

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

オーバーライドされているためtoString()、正しいことが起こります。

于 2012-06-19T07:18:34.897 に答える
1

私はこれが役立つかもしれないと思います:

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

上記のコードは、AJAXリクエストの文字セットをUTF-8に設定する必要があります。

于 2012-06-17T14:13:06.637 に答える
1
<?php
  $orignialmytext = $_REQUEST['mytext'];
  $decodedmytext = urldecode($orignialmytext);
  echo $decodedmytext;
?>
于 2012-06-13T14:34:16.610 に答える
1

ここで起こっているのは、ページが文字を Unicode としてエンコードしていることです。たとえば、%u0633 は文字列の最初の文字です。それは正常ですが、自動的に起こっていることに驚いています。

ここで、ビューアに表示するときにそれらをデコードする必要があります。

これはあなたが望むものかもしれません: http://www.php.net/manual/en/function.utf8-decode.php

string utf8_decode ( string $data )

この関数は、「%u0079」または「%u0078」のように見えるエンコードされた入力を受け取り、それを文字に戻します。PHP を使用して文字列を表示しようとするときは、次のようにラップします。

utf8decode("mystring")

show.php は次のようになるはずです。

<?php
  echo utf8decode($_REQUEST['mytext']);
?>
于 2012-06-13T14:31:08.997 に答える