通过此ajax函数发送带日语字符的表单时,字符以日语格式发送到服务器,数据存储为数据库中的数据。
var strAction = "/_ajax/save/"+sSavePage+"?action=saveseo&intFolderID="+iFolderID+"&intPageID="+iPageID;
var frm = $("#frmSmartPage");
var data = frm.serialize();
$.ajax({
type: frm.attr('method'),
url: strAction,
data: data,
success: function (data) {
alert('ok');
}
});
在同一页面上,表格也可以通过提交发布。然后将japansese字符转换为&#<number>
格式。
<form method="post" target="ajax_save" autocomplete="off" name="frmSmartPage" id="frmSmartPage" action="<%=constBetaPath%>/_ajax/save/pages_save.asp?intPageID=<%=intPageID%>&intFolderID=<%=intFolderID%>&action=save" onSubmit="return validateSave()">
我希望能够在ajax调用中将日语字符转换为&#<number>
格式,但到目前为止我没有运气。
我已经尝试过的事情:
var data = unescape(encodeURIComponent(frm.serialize()));
---
var data = escape(frm.serialize());
---
accepts: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
---
contentType: 'application/x-www-form-urlencoded;'
---
contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
编辑:
Html编码:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
编辑2:
后端代码正在将iso-8859-1解码为UTF8
'******************************************************************************************************************
'' @SDESCRIPTION: Decodes from ISO-8859-1 to UTF8
'' @PARAM: - s [string]: your string to be decoded
'' @RETURN: [string] decoded string
'' @DESCRIPTION: Usefull to use when saving special chars from a ISO-8859-1 post to an UTF-8 page, example via AJAX
'******************************************************************************************************************
public function DecodeUTF8(s)
dim i
dim c
dim n
s = s + " "
i = 1
do while i <= len(s)
c = asc(mid(s,i,1))
if c and &H80 then
n = 1
do while i + n < len(s)
if (asc(mid(s,i+n,1)) and &HC0) <> &H80 then
exit do
end if
n = n + 1
loop
if n = 2 and ((c and &HE0) = &HC0) then
c = asc(mid(s,i+1,1)) + &H40 * (c and &H01)
else
c = 191
end if
s = left(s,i-1) + chr(c) + mid(s,i+n)
end if
i = i + 1
loop
DecodeUTF8 = Left(s, Len(s)-1)
end function
解 感谢ÁlvaroGonzález的回复,我可以通过创建一个用于提交的临时表单来创建一个变通方法。
var strAction = "/_ajax/save/"+sSavePage+"?action=saveseo&intFolderID="+iFolderID+"&intPageID="+iPageID;
var newForm = $('<form />');
var orginalForm = $("#frmSmartPage");
newForm.append(orginalForm.clone().children());
newForm.attr('method', 'post');
newForm.attr('target', 'ajax_save');
newForm.attr('action', strAction);
newForm.css('display', 'none');
orginalForm.parent().append(newForm);
var target = $("#ajax_save");
target.one('load', function () {
newForm.remove();
});
newForm.submit();
答案 0 :(得分:2)
你有一个严重的根本问题:ISO-8859-1字符集(也称为Latin-1,应该已经给你一个线索)是为西欧语言使用的拉丁字母设计的,并且根本不能编码日语字符。在其他地方你使用UTF-8,这是目前唯一合理的编码选择,并没有任何此类限制,但ISO-8859-1是链中的薄弱环节,使得它非常糟糕复杂。
更糟糕的是,我发现一些让我担心的细节。您正在使用AJAX发送信息,因为AJAX mandates UTF-8,jQuery将自动将其转换为UTF-8。但是,服务器端代码错误地采用ISO-8859-1并将进行虚假转换。如果此代码已在生产中,则可能已损坏您已有的数据。
你基本上有两个选择:
将所有内容切换为UTF-8。这将在未来为您节省所有编码问题,但需要仔细迁移当前的代码库。
找出一种在客户端代码中将日语编码为ISO-8859-1并在服务器端代码中正确解码的方法。值得庆幸的是,浏览器已经意识到了这个问题,并且(因为HTML是他们的主语言),他们通常决定使用HTML实体(那些&#<number>
是什么来自哪些来源),当他们必须提交包含文档编码不支持的字符的表单。
在这种情况下,您需要做的是将服务器端代码更改为: