提交数据到数据库变成了乱码

时间:2021-01-06 06:40:58
程序代码如下,只三个文件(conn.asp , a.asp ,save.asp),程序说明:a.asp文件是主文件,它从数据库(db.mdb)的表users中调用两条数据(为方便不调几条,数据库中三个字段(id,name,sex),请随意填几个值),当点击其中的单元格即可编辑数据,当离开单元格即刻提交数据到数据库,在提交这里用了ajax,可是我怎么修改数据库中仍然是乱码。在网上找了半天也没找到答案,请高手们指点

prototype.js这个文件我就不上传了,




conn.asp文件如下
<%
artmdb="db.mdb"
set conn=server.CreateObject("adodb.connection")
DBPath = Server.MapPath(artmdb)
conn.open "provider=microsoft.jet.oledb.4.0; data source="&DBpath
%>



a.asp文件如下:
<!--#include file="conn.asp"-->
<script src=prototype.js></script>
<html>

<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title></title>
</head>

<body>
    <script>
        function modify(tar,id){
            if(window.event.srcElement!=tar){
                return(true);
            };
            var o = document.createElement("input");
            var str = tar.innerHTML;
            tar.innerHTML = "";

            o.name = "v";
            o.type = "text";
            o.value = str;
            o.onblur = function(){
                saveit(this.value, this,id)
            };
            o.onDblClick = function(){
                window.document.readyState != null;
            };
            o.onClick = function(){
                return false;
            };
            tar.appendChild(o);
            o.select();
            
        }
        
        function saveit(value, tar,id){
            var url="save.asp"
            var xmlhttp=new Ajax.Updater('result',url,{
            method:"post",
            asynchronous:false,
            parameters:"rand="+Math.random()+"&id="+id+"&db="+value
            });
            tar.parentNode.innerHTML = value;
        }
    </script>

<table border="1" width="400" id="table1">
<tr>
<td width=200>姓名</td>
<td width=200>性别</td>
</tr>
<%
set rs=conn.execute("select top 2 * from users")
do while not rs.eof
%>
<tr>
<td onclick=modify(this,<%=rs("id")%>)><%=rs("name")%> </td>
<td onclick=modify(this,<%=rs("id")%>)><%=rs("sex")%> </td>
</tr>
<%
rs.movenext
loop
%>
</table>

<div id="result">结果: </div>

</body>

</html>



save.asp文件如下 :
<!--#include file="conn.asp"-->
<%
Response.charset = "gb2312" 
'response.write request("id")+request("db")
conn.execute("update users set name='"&request("db")&"' where id="&request("id"))
%>


16 个解决方案

#1



<script src=prototype.js></script>

如果不用框架就没有问题。怎么会这样呢,现在都在用框架吧,怎么解决上面的问题呀。

#2


怎么没人回答,改prototype文件中的encoding为GB2313也不行啊.

#3


参数传递的时候用encodeURI 进行编码
encodeURI(参数)

#4


引用 3 楼 mzx87 的回复:
参数传递的时候用encodeURI 进行编码 
encodeURI(参数)


我试过了,不行啊。

#5


其实 我这段代码很简单,就少了一个prototype.js文件和一个数据库表,动手建一个,把我代码保存测试一下吧,急用啊。

#6


产生原因
主要有2个原因
1 xtmlhttp 返回的数据默认的字符编码是utf-8,如果前台页面是gb2312或者其它编码数据就会产生乱码
2 post方法提交数据默认的字符编码是utf-8,如果后台是gb2312或其他编码数据就会产生乱码

解决方法
进一步整理中
推荐方法,前台后台都用utf-8编码,这样可以省不少麻烦,从根本上解决了乱码问题.优点是效率高,而且符合目前的形式,utf-8编码本身就是一种比较优秀的编码,没有语言限制.缺点只能调用自己的后台编码或者其他的utf-8的编码.
前台更改为

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">


后台asp中第一行加入如下代码

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<% Response.Charset="utf-8"; %>
<% Session.CodePage=65001; %>


后台如果有html代码也需保证

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">



补救的方法是进行编码转换.可以在客户端也可以在服务器端进行编码转换.优点是没有任何限制,缺点效率低.
可参考本站的WEB代理(ASP版),这里是服务端的asp编码,由于脚本语言是javascript,所以直接复制到客户端也可以使用!

补充
如果是老系统升级ajax,如果系统是gb2312的话,也无需大修改
新建立一个ajax的后台页面编码是utf-8,前台可以为任意编码,后台页面负责添加数据库,可保证存入数据库后无乱码 



上面的方法也不行,我的是前台用javascript 传递参数, 后台是用asp接收参数。如果前台加编码,后台怎么解码。

#7


这是因为编码不统一的原因,文件编码,输出编码,网页编码这3者要统一。
一般情况下,文件编码都是ANSI格式(支持gb2312),而不是utf-8格式。
你用的是gb2312编码,不需要改成utf-8(当然改成utf-8也可以实现),那么可以这样处理:
<Quote>
1、确保所有文件的编码是ANSI格式
2、输出编码为gb2312
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
<% Response.Charset="gb2312"; %>
<% Session.CodePage=936; %>
3、网页编码为
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</Quote>

如果你要改成utf-8,方法相同,只是编码不同:
<Quote>
1、确保所有文件的编码是UTF-8格式
2、输出编码为UTF-8
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<% Response.Charset="UTF-8"; %>
<% Session.CodePage=65001; %>
3、网页编码为
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</Quote>

#8


前台charset改成utf8时,文件保存格式也要改成utf-8格式。

#9


能针对我的代码来一个能用的,就能实现我的代码的方法吗、?

#10


引用 9 楼 lunawzh 的回复:
能针对我的代码来一个能用的,就能实现我的代码的方法吗、?


就是针对你的代码写的,详细方法看我在7楼的回复。

#11


引用 10 楼 peacock 的回复:
引用 9 楼 lunawzh 的回复:
能针对我的代码来一个能用的,就能实现我的代码的方法吗、? 
 

就是针对你的代码写的,详细方法看我在7楼的回复。


是这样吗
把save.asp文件改为这样吗,怎么还是不行。
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%> 
<% Response.Charset="gb2312"; %> 
<% Session.CodePage=936; %> 
<!--#include file="conn.asp"-->
<%
'Response.charset = "utf-8" 
response.write request("id")+request("name")
conn.execute("update users set name='"&request("name")&"' where id="&request("id"))
%>

#12


晕,一定要看我写的第一句: 文件编码,输出编码,网页编码这3者要统一

我已经给你写出了2中编码的相关代码,第一个是gb2312的,第二个是utf-8的,不能混在一起

#13


peacock ,我所有的页面都是gb2312的,不是全改成了gb2312了吗,怎么还不行啊,我就是照你的做的啊,你看看还有那个地方要改。
一共就两个页,这不都是gb2312,输出是正常,可写到数据库就成了乱码

#14


已经可以肯定是编码的问题了,一定要检查3者是否统一,你可以全部换成utf-8再试试

#15


看来不好解决,还是不用框架了,用老办法,没有问题。

#16


我还是没懂,什么时候是解码,什么时候是编码呢

#1



<script src=prototype.js></script>

如果不用框架就没有问题。怎么会这样呢,现在都在用框架吧,怎么解决上面的问题呀。

#2


怎么没人回答,改prototype文件中的encoding为GB2313也不行啊.

#3


参数传递的时候用encodeURI 进行编码
encodeURI(参数)

#4


引用 3 楼 mzx87 的回复:
参数传递的时候用encodeURI 进行编码 
encodeURI(参数)


我试过了,不行啊。

#5


其实 我这段代码很简单,就少了一个prototype.js文件和一个数据库表,动手建一个,把我代码保存测试一下吧,急用啊。

#6


产生原因
主要有2个原因
1 xtmlhttp 返回的数据默认的字符编码是utf-8,如果前台页面是gb2312或者其它编码数据就会产生乱码
2 post方法提交数据默认的字符编码是utf-8,如果后台是gb2312或其他编码数据就会产生乱码

解决方法
进一步整理中
推荐方法,前台后台都用utf-8编码,这样可以省不少麻烦,从根本上解决了乱码问题.优点是效率高,而且符合目前的形式,utf-8编码本身就是一种比较优秀的编码,没有语言限制.缺点只能调用自己的后台编码或者其他的utf-8的编码.
前台更改为

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">


后台asp中第一行加入如下代码

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<% Response.Charset="utf-8"; %>
<% Session.CodePage=65001; %>


后台如果有html代码也需保证

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">



补救的方法是进行编码转换.可以在客户端也可以在服务器端进行编码转换.优点是没有任何限制,缺点效率低.
可参考本站的WEB代理(ASP版),这里是服务端的asp编码,由于脚本语言是javascript,所以直接复制到客户端也可以使用!

补充
如果是老系统升级ajax,如果系统是gb2312的话,也无需大修改
新建立一个ajax的后台页面编码是utf-8,前台可以为任意编码,后台页面负责添加数据库,可保证存入数据库后无乱码 



上面的方法也不行,我的是前台用javascript 传递参数, 后台是用asp接收参数。如果前台加编码,后台怎么解码。

#7


这是因为编码不统一的原因,文件编码,输出编码,网页编码这3者要统一。
一般情况下,文件编码都是ANSI格式(支持gb2312),而不是utf-8格式。
你用的是gb2312编码,不需要改成utf-8(当然改成utf-8也可以实现),那么可以这样处理:
<Quote>
1、确保所有文件的编码是ANSI格式
2、输出编码为gb2312
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
<% Response.Charset="gb2312"; %>
<% Session.CodePage=936; %>
3、网页编码为
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</Quote>

如果你要改成utf-8,方法相同,只是编码不同:
<Quote>
1、确保所有文件的编码是UTF-8格式
2、输出编码为UTF-8
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<% Response.Charset="UTF-8"; %>
<% Session.CodePage=65001; %>
3、网页编码为
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</Quote>

#8


前台charset改成utf8时,文件保存格式也要改成utf-8格式。

#9


能针对我的代码来一个能用的,就能实现我的代码的方法吗、?

#10


引用 9 楼 lunawzh 的回复:
能针对我的代码来一个能用的,就能实现我的代码的方法吗、?


就是针对你的代码写的,详细方法看我在7楼的回复。

#11


引用 10 楼 peacock 的回复:
引用 9 楼 lunawzh 的回复:
能针对我的代码来一个能用的,就能实现我的代码的方法吗、? 
 

就是针对你的代码写的,详细方法看我在7楼的回复。


是这样吗
把save.asp文件改为这样吗,怎么还是不行。
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%> 
<% Response.Charset="gb2312"; %> 
<% Session.CodePage=936; %> 
<!--#include file="conn.asp"-->
<%
'Response.charset = "utf-8" 
response.write request("id")+request("name")
conn.execute("update users set name='"&request("name")&"' where id="&request("id"))
%>

#12


晕,一定要看我写的第一句: 文件编码,输出编码,网页编码这3者要统一

我已经给你写出了2中编码的相关代码,第一个是gb2312的,第二个是utf-8的,不能混在一起

#13


peacock ,我所有的页面都是gb2312的,不是全改成了gb2312了吗,怎么还不行啊,我就是照你的做的啊,你看看还有那个地方要改。
一共就两个页,这不都是gb2312,输出是正常,可写到数据库就成了乱码

#14


已经可以肯定是编码的问题了,一定要检查3者是否统一,你可以全部换成utf-8再试试

#15


看来不好解决,还是不用框架了,用老办法,没有问题。

#16


我还是没懂,什么时候是解码,什么时候是编码呢