And*_*rew 6 forms ajax encoding
我正在使用AJAX表单将数据发送到另一个名为"show.php"的页面.这是页面的来源:
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>
Run Code Online (Sandbox Code Playgroud)
show.php
<?php
echo $_REQUEST['mytext'];
?>
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
问题
当我在字段中输入英文字符时,数据传输成功,我收到它们在表单的顶部.
但是当我尝试输入阿拉伯字符时,我会收到另一个数据,比如编码的单词.例如:%u0633%u0644%u0627%u0645.%u0686%u0637%u0648%u0631%u06CC而不是:
سلام.چطوری(如果你有字体.)
我怎么解决这个问题?
你正在使用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"
Run Code Online (Sandbox Code Playgroud)
以上应该取代你的GetElemValue()功能.注意如何通过添加所需的函数(如appendParam())或覆盖已存在的函数(如)来调整对象toString().
另请注意,您可以从函数返回数组本身getquerystring().JavaScript会toString()在以下情况下自动调用:
var url = "http://bla/" + qstr
Run Code Online (Sandbox Code Playgroud)
由于toString()被覆盖,正确的事情将会发生.
这里发生的事情是您的页面将字符编码为 unicode。例如,%u0633 是字符串中的第一个字符。这是正常的,但我很惊讶它会自动发生。
现在,您需要在向查看者显示时对它们进行解码。
看起来这可能就是您想要的: http ://www.php.net/manual/en/function.utf8-decode.php
string utf8_decode ( string $data )
Run Code Online (Sandbox Code Playgroud)
该函数接受编码输入(看起来像“%u0079”或“%u0078”)并将其转换回字母。当您尝试使用 PHP 显示字符串时,请将其包装在:
utf8decode("mystring")
Run Code Online (Sandbox Code Playgroud)
我认为 show.php 应该如下所示:
<?php
echo utf8decode($_REQUEST['mytext']);
?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4680 次 |
| 最近记录: |