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">&nbsp;</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>&nbsp;&nbsp;&nbsp;</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">&nbsp;</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>&nbsp;&nbsp;&nbsp;</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 文件中获取奇怪的字符

记一个奇怪的编码转换问题,及探讨“错误: 编码GBK的不可映射字符” 的原因

通过 AJAX 发布时字符编码错误

编码无法发送到 API Node JS 的奇怪字符

jQuery AJAX 调用搞乱了字符编码