Ajax 字符编码,进入 SQL 很奇怪
Posted
技术标签:
【中文标题】Ajax 字符编码,进入 SQL 很奇怪【英文标题】:Ajax character encoding, weird going into SQL 【发布时间】:2014-11-14 10:55:03 【问题描述】:我有 2 个 asp 经典页面,它们都做同样的事情。获取字符串并将它们放入数据库中。
Test1.asp:
<%@Language=VBScript %>
<%OPTION EXPLICIT%>
<!-- #INCLUDE FILE="../G_FILES/globals.asp"-->
<!-- #INCLUDE FILE="../g_files/validation.asp"-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<link rel="stylesheet" type="text/css" href="<%=gStyle%>">
<script language="javascript" src="../js_files/jquery/jquery-1.10.2.min.js"></script>
<script src="../js_files/jquery/jquery.limit-1.2.source.js"></script>
<script type="text/javascript" src="../js_files/webdb_helper.js"></script>
<script language="javascript">
$(document).ready(function ()
//CHARACTER COUNT/LIMITATION TEXTAREA
$('#body').limit('3000', '#charLeft');
);
//Save Message
$(document).ready(function()
$("#saveBtn").click(function()
var subject = $('#subject').val();
var body = $('#body').val();
var all_good = true;
//NO ERRORS? INSERT INTO DB
if (all_good)
$.ajax(
type: 'POST',
url: "edit_template_test.asp",
data:
subject: subject,
body: body
,
async: false,
cache: false,
error: function(jqXHR, textStatus)
alert("Request failed: " + textStatus);
var error = jqXHR.responseText;
alert(error);
).done(function(response)
//reload message list
alert(response);
);
);
);
</script>
</head>
<body style ="width:700px">
<center class="BodyTextBoldDoubleTitle">Service Provider Communications</center><br />
<table class="BodyTextBoldSingle">
<tr>
<td>Email Subject:</td>
<td colspan="4"><input type="text" size="91" maxlength='120' id="subject" value =""/></td>
</tr>
<tr><td colspan="5"> </td></tr>
<tr>
<td colspan="5">Body:</td>
</tr>
<tr>
<td colspan="5"><textarea id='body' rows="13" cols="80"></textarea></td>
</tr>
<tr>
<td colspan="4">You have <font id="charLeft">0</font>/3000 characters left.</td>
</tr>
<table class="BodyTextBoldSingle">
<tr>
<td> </td>
<td><div id="saveBtn" style="border: 2px solid; border-radius: 40px 40px; background-color: #C0C0C0; height: 25px; width:155px; text-align: center; vertical-align: middle; line-height: 25px; cursor: pointer" ><font class="BodyTextBoldSingle">Save</font></div></td>
</tr>
</table>
</center>
</body>
</html>
这通过ajax调用edit_template_test.asp:
<%@Language=VBScript %>
<%OPTION EXPLICIT%>
<!-- #include file="../g_files/globals.asp" -->
<!-- #INCLUDE FILE="../g_files/validation.asp"-->
<%
dim subject,body
subject = Request.Form("subject")
body = Request.Form("body")
dim db, sql
set db = Server.CreateObject("Commands.DB")
sql = "update folder_log set subject = ' " & subject & "', note = '" & body & "' where msg_id = '00D8EE44-197D-4F95-938E-887005FCE0D6'"
db.RunCMD g_Conn, sql
Response.Write subject&"^"&body
%>
Test2.asp:
<%@Language=VBScript %>
<%OPTION EXPLICIT%>
<!-- #INCLUDE FILE="../G_FILES/globals.asp"-->
<!-- #INCLUDE FILE="../g_files/validation.asp"-->
<%
dim body1, subject1
Dim test_send
test_send= trim(request.Form("test_send"))
if test_send = "yes" then
Response.Write "hello"
body1 = request.Form("body2")
subject1 = request.Form("subject2")
dim db, sql
set db = Server.CreateObject("Commands.DB")
sql = "update folder_log set subject = ' " & subject1 & "', note = '" & body1 & "' where msg_id = '7E59E4EE-6682-4C74-BD65-9F0244742BC5'"
db.RunCMD g_Conn, sql
end if
%>
<html>
<head>
<title></title>
<link rel="stylesheet" type="text/css" href="<%=gStyle%>">
<script language="javascript" src="../js_files/jquery/jquery-1.10.2.min.js"></script>
<script src="../js_files/jquery/jquery.limit-1.2.source.js"></script>
<script type="text/javascript" src="../js_files/webdb_helper.js"></script>
<script language="javascript">
</script>
</head>
<body style ="width:700px">
<form name="test2" id="test2" method="post" action="test2.asp" >
<center class="BodyTextBoldDoubleTitle">Service Provider Communications</center><br />
<table class="BodyTextBoldSingle">
<tr>
<td>Email Subject:</td>
<td colspan="4"><input type="text" size="91" name="subject2" maxlength='120' id="subject2" value =""/></td>
</tr>
<tr><td colspan="5"> </td></tr>
<tr>
<td colspan="5">Body:</td>
</tr>
<tr>
<td colspan="5"><textarea name="body2" id="body2" rows="13" cols="80"></textarea></td>
</tr>
<tr>
<td colspan="4">You have <font id="charLeft">0</font>/3000 characters left.</td>
</tr>
<tr>
<td> </td>
<input type="hidden" name="test_send" value="yes" ID="test_send">
<td><input type="submit" name = "Save" /></td>
</tr>
</table>
</center>
</form>
</body>
</html>
除了一件事之外,Test1 和 Test2 都产生相同的预期结果(进入 DB)。
当从 Word 复制并粘贴包含 Words 不同字符之一的字符串(例如 TEST – “TEST”)时,Test2.asp(回发)可以完美运行,但 Test1.asp 会将时髦字符放入 DB (测试 - “测试” -> 测试 - “测试”)。
有谁知道为什么回发可以正常工作,但 ajax 路由有编码问题?
我已经尝试了各种解决方案来让它发挥作用。即:
contentType: 'Content-type: text/plain; charset=iso-8859-1',
beforeSend: function(jqXHR)
jqXHR.overrideMimeType('text/html;charset=iso-8859-1');
,
以及其他类型的编码/解码方法。我真的很想让 ajax 方法工作。
有人解释了吗?
如果相关,则 sql server 中的字符编码为 SQL_Latin1_General_CP1_CI_AS。
【问题讨论】:
在标题中使用所有大写字母被视为 SHOUTING。尽量避免这种情况。 哦,好吧,我的错。嗯,有没有办法编辑标题? 有人帮我做的。不错,你! 在 SO 上发布一些内容 30 秒,有人会搞砸它。 ;) 这并不能回答您的问题,但假设有人输入了“我的主题”的主题,msg_id = '0”。这将导致严重的完整性问题,并且可能会做得更糟。您应该始终使用参数化查询。 【参考方案1】:这是由于字符编码。确保您已使用 UTF-8 编码保存了所有 .ASP 文件(例如在记事本中打开它们,选择“文件”>“另存为”,然后在“另存为”对话框中选择 UTF-8 编码)。
您还应该更改“edit_template_test.asp”中的代码以摆脱任何讨厌的 SQL 注入(想象一下,如果您在主题参数中发送 '; DROP TABLE ... -- )。做这样的事情:
dim subject,body
subject = Request.Form("subject")
body = Request.Form("body")
dim db, sql
set db = Server.CreateObject("Commands.DB")
sql = "update folder_log set subject = ' " & Replace(subject,"'","''") & "', note = '" & Replace(body,"'","''") & "' where msg_id = '00D8EE44-197D-4F95-938E-887005FCE0D6'"
db.RunCMD g_Conn, sql
Response.Write Server.HtmlEncode(subject&"^"&body)
无论如何,以 UTF-8 编码保存文件应将所有浏览器切换为以 UTF-8 呈现和发布数据。如果没有,您可能需要为 ASP 经典版执行以下操作:Classic ASP's Request.Form is dropping an 8-bit character -- is there a simple way to prevent this?
祝你好运!
【讨论】:
【参考方案2】:尝试从 Test1.asp 中删除 DOCTYPE
声明
还有 SQL_Latin1_General_CP1_CI_AS 只是一个collation property 用于 SQL 服务器(默认:ASCII)
【讨论】:
【参考方案3】:javascript
因此ajax
字符串的标准编码是始终 utf8
!
因此,在将字符串传递给 ajax
函数之前,请务必将它们转换为 utf8
。
当从ajax
接收它们时,请注意您收到了utf8
编码字符串,然后将它们转换为您想要的任何编码。
【讨论】:
【参考方案4】:尝试添加
<meta charset="UTF-8">
在你的 html 文件的头部
为什么选择 UTF-8:
UTF-8 支持的字符比 ASCII 多,允许国际化 要表示的语言。
【讨论】:
以上是关于Ajax 字符编码,进入 SQL 很奇怪的主要内容,如果未能解决你的问题,请参考以下文章
PHP:simplexml_load_file 从使用 UTF-8 编码的 XML 文件中获取奇怪的字符