utf8页面post form到gb2312

gb2312编码页面post到utf-8页面乱码解决方案

2010年08月17日 星期二 16:34

说实话,要是所有网站都采用统一编码,根本就不会出现这样或那样的编码问题,不过现在的问题是既然已经存在了n种编码了,总得想办法解决吧。由于目前国内 gb2312、utf-8的编码网站较多(big5等忽略不计),当想gb2312从页面提交表单至utf-8时,问题就来了。解决方案:
在gb2312页面的form中添加:accept-charset="utf-8" onsubmit="document.charset='utf-8';",如:
<form method="post" action="2.php" accept-charset="utf-8" onsubmit="document.charset='utf-8';">
这样一来,ie、ff、opera、google等主流浏览器都欣然接受了。但是当提交后直接后退这又出现新问题了,form页面变成乱码,别怕,再在gb2312页面的<head></head>之间加上如下代码:
<script>
if(document.charset!="gb2312" && navigator.userAgent.indexOf("MSIE")>0){
       window.location.reload();
}
</script>
至此,问题得以完美解决。

 

 

 

 

从 UTF8 编码页面 Post 数据到 GB2312 页面乱码问题解决方法

2009年07月06日 星期一 04:41

  问题描述

  从 UTF8 编码页面 Post 数据到 GB2312 页面,如包含中文则接收的数据会发生乱码。

解决方法

  IE浏览器,利用JS实现:

  document.charset = "gb2312";

  document.form1.submit();

  FF浏览器,利用HTML实现:

  <form name="form1" accept-charset="gb2312" method="post" action=””>

  ...

  ...

  </form>

  两种方法结合,可基本解决此问题。

 

 

很好的文章

http://www.cnblogs.com/QLeelulu/archive/2009/03/17/1414064.html

 

http://www.enjoyphp.com/2010/development/php/iconv_post/

http://www.imf7.com/archives/5

 

 

 

 

 

 

从 UTF8 编码页面 Post 数据到 GB2312 页面乱码问题解决方法

问题描述

  从 UTF8 编码页面 Post 数据到 GB2312 页面,如包含中文则接收的数据会发生乱码。

解决方法

  IE浏览器,利用JS实现:

  document.charset = "gb2312";

  document.form1.submit();

  FF浏览器,利用HTML实现:

  <form name="form1" accept-charset="gb2312" method="post" action=””>

  ...

  ...

  </form>

  两种方法结合,可基本解决此问题。

<think> 我们面临的需求是:在ASP环境中,HTML页面使用UTF-8编码,而ASP代码本身使用GB2312编码。这种情况下,我们需要确保在ASP处理过程中能够正确处理UTF-8编码的字符串(例如来自表单提交或数据库的UTF-8数据),并在输出到HTML(UTF-8)时保持正确编码。 根据引用[1]和引用[4],我们可以通过设置CodePage和Charset来切换页面的编码处理方式。但是,用户的需求是在同一个页面中同时处理两种编码:ASP代码使用GB2312,而输出到HTML的是UTF-8。 这里有一个关键点:ASP页面的编码设置(通过`Response.CodePage`和`Response.Charset`)会影响整个页面的输入(如Request)和输出(如Response)。如果我们希望ASP代码以GB2312方式处理,但最终输出UTF-8,我们需要分段设置编码。 解决方案: 1. 在页面的顶部,我们设置ASP处理请求时使用UTF-8(这样能正确接收UTF-8编码的输入数据)。 2. 在ASP代码处理过程中,如果需要将字符串从UTF-8转换为GB2312(因为ASP代码内部处理需要GB2312),则使用之前提供的转换函数(如`UTF8ToGB2312`或`UTF8ToGBK`)。 3. 在输出之前,将整个页面的输出编码设置为UTF-8,这样浏览器就会以UTF-8显示。 但是注意:如果我们在同一个页面中既想处理GB2312的字符串,又想输出UTF-8,那么我们需要确保在输出之前将内部处理的GB2312字符串转换回UTF-8,或者确保内部处理的字符串已经是UTF-8(这样就不需要转换输出)。 实际上,用户的需求可能是:ASP代码内部使用GB2312编码处理字符串(例如,一些老的ASP组件要求GB2312输入),而页面输出要求UTF-8。 因此,我们可以这样实现: 步骤1:在页面最开始,设置接收输入为UTF-8(这样Request得到的是UTF-8字符串) 步骤2:将接收到的UTF-8字符串转换为GB2312,供ASP代码内部处理(如果内部处理需要GB2312) 步骤3:在ASP代码内部使用GB2312编码的字符串进行处理 步骤4:在输出之前,将处理后的字符串(GB2312编码)再转换回UTF-8(因为我们的输出页面是UTF-8) 步骤5:设置输出编码为UTF-8,然后输出字符串 但是,这种转换在同一个页面中会非常繁琐,而且容易出错。另一种思路是:在页面顶部设置接收为UTF-8,然后内部处理全部使用UTF-8,避免转换。但是,如果有一些组件必须使用GB2312,那么我们在调用组件之前将字符串转换为GB2312,得到组件的输出后(GB2312编码)再转换回UTF-8,然后输出。 因此,我们可能需要两个转换函数:UTF8GB2312(用于输入到组件)和GB2312UTF8(用于组件的输出)。 我们之前已经提供了UTF8GB2312的函数,现在需要提供GB2312UTF8的函数。 具体实现: 1. 在页面顶部设置接收为UTF-8: <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <% Response.CodePage = 65001 ' 设置输入输出都使用UTF-8 Response.Charset = "UTF-8" %> 2. 但是,如果我们的ASP代码内部处理需要用到GB2312,那么我们在调用需要GB2312的组件之前,将字符串从UTF-8转换为GB2312(使用之前的函数)。 3. 组件返回的字符串是GB2312编码,我们需要将其转换为UTF-8,然后再输出。 4. 因此,我们还需要一个从GB2312到UTF-8的转换函数(与之前的函数相反)。 转换函数(GB2312转UTF-8): ```asp <% Function GB2312ToUTF8(gbStr) On Error Resume Next Dim stream Set stream = Server.CreateObject("ADODB.Stream") With stream .Type = 2 .Mode = 3 .Charset = "gb2312" ' 原始编码是GB2312 .Open .WriteText gbStr .Position = 0 .Charset = "utf-8" ' 目标编码 GB2312ToUTF8 = .ReadText .Close End With Set stream = Nothing If Err.Number <> 0 Then GB2312ToUTF8 = gbStr End If End Function %> ``` 5. 使用示例: 假设我们有一个组件(比如一个用VB6写的COM组件),它需要GB2312字符串,并返回GB2312字符串。 ```asp <% ' 假设我们有一个UTF-8字符串(来自表单,因为设置了CodePage=65001,所以Request.Form得到的是UTF-8字符串) Dim inputUTF8 inputUTF8 = Request.Form("data") ' 转换为GB2312以便传递给组件 Dim inputGB inputGB = UTF8ToGB2312(inputUTF8) ' 调用组件,假设组件返回一个GB2312字符串 Dim resultGB resultGB = MyComponent.Process(inputGB) ' MyComponent是假设的组件 ' 将组件返回的GB2312字符串转换回UTF-8 Dim resultUTF8 resultUTF8 = GB2312ToUTF8(resultGB) ' 输出到页面(此时页面已经是UTF-8,所以直接输出) Response.Write resultUTF8 %> ``` 6. 注意:整个页面的输出编码已经在顶部设置为UTF-8,所以最后输出的字符串应该是UTF-8编码。 但是,如果我们的ASP代码内部不需要调用组件,而是自己处理字符串(比如用VBScript的字符串函数),那么我们可以选择在内部处理时使用UTF-8,避免转换。因为VBScript本身是支持Unicode的,但是它在处理字符串时,会按照当前CodePage来解释。所以,如果我们设置CodePage为65001(UTF-8),那么VBScript的字符串函数(如Len, Mid等)也能正确处理UTF-8字符串(但是要注意,一个中文字符在UTF-8中可能占用3个字节,而VBScript的字符串函数是按字符处理的,在UTF-8下,一个中文字符会被当作一个字符,而不是三个字符)。 然而,在CodePage为65001时,VBScript的字符串函数在处理多字节字符时可能会遇到问题(比如,Len函数返回的字符数可能不正确,因为VBScript内部使用Unicode,所以一个中文字符算一个字符,但如果是UTF-8编码的字符串,VBScript会自动转换为Unicode,所以Len函数返回的是字符数,不是字节数)。所以,如果我们只是做普通的字符串操作(比如拼接、取子串等),那么使用UTF-8内部处理是没问题的。 因此,根据实际需求选择: - 如果整个处理流程不需要GB2312,那么全程使用UTF-8即可,不需要转换。 - 如果必须使用GB2312(比如调用旧组件),则需要在调用组件前转换编码,并在得到结果后转换回UTF-8。 总结实现方法: 1. 在页面顶部设置CodePage为65001,Charset为UTF-8(确保接收和输出都是UTF-8)。 2. 如果ASP代码内部处理需要GB2312,则使用转换函数将字符串从UTF-8转为GB2312,处理完后再转回UTF-8。 3. 如果不需要,则直接使用UTF-8字符串处理。 另外,关于引用的使用:根据用户提供的引用,我们看到在引用[1]中提到了在接收参数前设置CodePage为65001(UTF-8),然后在显示之前再设置为936(GB2312)。但是,这种方法是在同一个页面中切换编码,这会导致输出编码也变成GB2312,而我们要求最终输出是UTF-8。所以,我们不采用切换整个页面编码的方法,而是采用转换函数对特定字符串进行转换。 因此,我们推荐使用转换函数,而不是切换整个页面的CodePage。 最终,我们提供两个转换函数(UTF8ToGB2312GB2312ToUTF8)来满足需求。 示例页面结构: ```asp <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <% Response.CodePage = 65001 Response.Charset = "UTF-8" %> <% ' 包含转换函数的文件 %> <!-- #include file="encoding_functions.asp" --> <% ' 获取表单数据(UTF-8编码) Dim name name = Request.Form("name") ' 假设我们需要将name传递给一个需要GB2312编码的组件 Dim nameGB nameGB = UTF8ToGB2312(name) ' 调用组件处理 Dim resultGB Set myComponent = Server.CreateObject("MyComponent.Class") resultGB = myComponent.Process(nameGB) Set myComponent = Nothing ' 将结果转换回UTF-8 Dim resultUTF8 resultUTF8 = GB2312ToUTF8(resultGB) ' 输出结果(此时是UTF-8编码) Response.Write "<p>处理结果:" & Server.HTMLEncode(resultUTF8) & "</p>" %> ``` 注意:在输出到HTML之前,如果字符串包含HTML特殊字符,应该使用Server.HTMLEncode进行编码,避免XSS攻击。 这样就实现了:HTML页面是UTF-8编码,ASP代码在处理过程中使用GB2312与组件交互,最终输出UTF-8。 如果不需要与组件交互,则不需要转换,直接使用UTF-8字符串即可。 相关问题: 1. 如何解决转换过程中遇到的无效字符问题? 2. 在ASP中如何检测字符串的当前编码? 3. 使用GBK代替GB2312有哪些优势? </think>在ASP环境中实现HTML页面使用UTF-8编码而ASP代码使用GB2312编码的解决方案如下,基于多编码环境下的最佳实践: ### 核心实现方案 ```asp <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%' 设置ASP脚本引擎使用GB2312%> <% ' 第一部分:ASP处理区(GB2312环境) Response.CodePage = 936 ' 设置ASP处理使用GB2312编码 Response.Charset = "gb2312" ' 声明响应字符集为GB2312 ' 处理来自UTF-8页面的数据 Function ReceiveUTF8Data(paramName) Dim inputData inputData = Request.Form(paramName) ' 当需要GB2312处理时转换编码 ReceiveUTF8Data = UTF8ToGB2312(inputData) End Function ' UTF-8转GB2312转换函数 Function UTF8ToGB2312(utf8Str) On Error Resume Next Dim stream : Set stream = Server.CreateObject("ADODB.Stream") stream.Type = 2 stream.Mode = 3 stream.Charset = "utf-8" stream.Open stream.WriteText utf8Str stream.Position = 0 stream.Charset = "gb2312" UTF8ToGB2312 = stream.ReadText stream.Close Set stream = Nothing If Err Then UTF8ToGB2312 = utf8Str End Function %> <% ' 第二部分:HTML输出区(切换回UTF-8) Response.CodePage = 65001 ' 切换为UTF-8输出编码 Response.Charset = "UTF-8" ' 设置HTML页面使用UTF-8 %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>UTF-8页面示例</title> </head> <body> <% ' 第三部分:混合处理区 Dim userData userData = ReceiveUTF8Data("user_input") ' 接收并转换UTF-8数据 ' 输出前确保转换为UTF-8 Response.Write "<div>处理后的数据:" & Server.HTMLEncode(GB2312ToUTF8(userData)) & "</div>" %> </body> </html> <% ' GB2312转UTF-8函数(用于输出) Function GB2312ToUTF8(gbStr) On Error Resume Next Dim stream : Set stream = Server.CreateObject("ADODB.Stream") stream.Type = 2 stream.Mode = 3 stream.Charset = "gb2312" stream.Open stream.WriteText gbStr stream.Position = 0 stream.Charset = "utf-8" GB2312ToUTF8 = stream.ReadText stream.Close Set stream = Nothing If Err Then GB2312ToUTF8 = gbStr End Function %> ``` ### 关键实现原理 1. **编码区域分离**(核心策略) - **ASP处理区**:使用`<%@ CODEPAGE=936 %>`和`Response.CodePage=936`确保VBScript引擎以GB2312处理字符串 - **HTML输出区**:通过`Response.CodePage=65001`和`<meta charset=utf-8>`切换为UTF-8输出环境 2. **数据转换流程**: ```mermaid graph LR A[UTF-8表单输入] --> B{ADODB.Stream转换} B -->|UTF8GB2312| C[ASP-GB2312处理] C --> D{ADODB.Stream转换} D -->|GB2312UTF8| E[HTML-UTF8输出] ``` 3. **表单提交注意事项**: ```html <!-- UTF-8源表单示例 --> <form action="gb2312_processor.asp" method="post" accept-charset="utf-8"> <input type="text" name="user_input"> </form> ``` ### 解决的关键问题 1. **乱码预防**: - 请求处理前明确声明编码:`Session.CodePage=65001` - 使用`Server.HTMLEncode`处理特殊字符[^1] - 表单提交添加`accept-charset="utf-8"` 2. **编码检测辅助**: ```asp Function GetEncodingType(str) If Len(str) = LenB(str) Then GetEncodingType = "ASCII" ElseIf InStr(str, ChrW(8364)) > 0 Then ' 欧元符号检测 GetEncodingType = "UTF-8" Else GetEncodingType = "GB2312/ANSI" End If End Function ``` 3. **文件操作适配**: ```asp ' 生成UTF-8文件 Set fs = Server.CreateObject("Scripting.FileSystemObject") Set file = fs.CreateTextFile("output.html", True, True) ' 最后参数True表示UTF-8 file.Write "UTF-8内容" file.Close ``` ### 推荐实践 1. **统一编码最佳**: - 新项目建议全程使用UTF-8:`<%@ CODEPAGE=65001 %>` - 旧系统迁移时采用上述混合方案 2. **GBK替代方案**: ```asp ' 更推荐使用GBK编码(兼容更多汉字) Response.CodePage = 936 ' GBK使用与GB2312相同的代码页 stream.Charset = "gbk" ' 但实际支持20902个汉字 ``` 3. **全局配置建议**: ```asp <!-- 在公共包含文件(如config.asp)中设置 --> <% Session.CodePage = 65001 Response.Charset = "UTF-8" %> ``` > **重要提示**:在包含文件中使用`Session.CodePage`会影响所有包含该文件的页面,确保与页面级设置一致[^4]。 此方案通过精准控制不同处理阶段的编码环境,成功解决了UTF-8页面GB2312 ASP代码的兼容性问题,特别适用于需要与旧系统集成的场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值