form提交时的字符编码转换之utf-8转gb2312

16 篇文章 0 订阅
6 篇文章 0 订阅

  在IE下面指定表单提交编码方式 收藏 
在跨业务、跨网站发送数据或者业务升级的时候,我们有的时候需要指定发送数据的编码方式,比如页面是utf-8编码的,而发送出去的数据却希望是GB2312编码的。在做Ajax开发的时候,我们往往都是用vbscript或者用查字典法来解决这个问题(http://www.blogjava.net/emu/articles/31756.html)。但是有些业务,也许并不需要做成Ajax这么复杂,用表单提交显得更加自然。

其实html里面form标签有个accept-charset属性,可以帮助我们解决这个问题,可惜的是傻乎乎的IE浏览器虽然认得accept-charset,却并不卖它的帐。IE的表单提交的时候使用什么编码是完全看页面的charset决定的。还好,IE在charset这个问题上一傻到底(见http://www.blogjava.net/emu/archive/2007/08/21/138247.html),糊弄它一下,它就乖乖听话了:

view plaincopy to clipboardprint?

[c-sharp]  view plain copy
  1. <HTML>      
  2. <HEAD>      
  3.     <meta http-equiv=content-type content="text/html; charset=UTF-8">      
  4.     <SCRIPT LANGUAGE="JavaScript">      
  5.         var isIE=!!window.ActiveXObject;      
  6.         if(isIE && document.charset!="utf-8")location.reload(false);      
  7.     </SCRIPT>      
  8.     <TITLE>encode before form post</TITLE>      
  9.     <META NAME="Author" CONTENT="emu">      
  10. </HEAD>      
  11. <BODY>      
  12.     <form action="#" accept-charset="GB2312" οnsubmit="if(isIE)document.charset='GB2312'">      
  13.         <input name="test" value="我" readonly>      
  14.         <input type=submit>      
  15.     </form>      
  16. </BODY>      
  17. </HTML>     

简单的讲,就是在表单发送前告诉IE说当前页面是GB2312编码就行了: 
<form accept-charset="GB2312" οnsubmit="if(isIE)document.charset=''GB2312''"> 
accept-charset="GB2312" 是写给其他没那么笨的浏览器看的。

IE为了表现它确实是一傻到底,不但在设置document.charset的时候不会用新的编码解释页面,还会在前进后退(我特地用#作为action来实现后退)的时候又尝试用新的编码去解释页面。不过还好,可以用脚本判断出来,还可以用脚本刷新一下页面解决这个问题: 
if(isIE && document.charset!="utf-8")location.reload(false);

例:提交到百度 
view plaincopy to clipboardprint?

[javascript]  view plain copy
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">      
  2. <html xmlns="http://www.w3.org/1999/xhtml">      
  3. <head>      
  4. <meta name="publisher" content="TideCMS">      
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />      
  6. <title>表单提交</title>      
  7. <body>      
  8. <form action="http://www.baidu.com/s" name="f"  accept-charset="GBK"  οnsubmit="document.charset='GBK'" target="_blank"><input type="text" maxlength="100" size="42" id="kw" name="wd" autocomplete="off"/> <input type="submit" id="sb" value="百度一下"/><span id="hp"><a href="/gaoji/preferences.html" mce_href="gaoji/preferences.html">设置</a><br/><a href="/gaoji/advanced.html" mce_href="gaoji/advanced.html">高级</a></span></form>      
  9. </body>      
  10. </html>     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用urlencode函数将字符转换成application/x-www-form-urlencoded格式。例如,在C语言中,可以使用以下代码实现: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char str[] = "hello world"; char *encoded_str = NULL; encoded_str = (char *)malloc(strlen(str) * 3 + 1); if (encoded_str == NULL) { printf("Memory allocation failed!\n"); return -1; } int i, j = ; for (i = ; i < strlen(str); i++) { if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z') || (str[i] >= '' && str[i] <= '9') || (str[i] == '-' || str[i] == '_' || str[i] == '.' || str[i] == '~')) { encoded_str[j++] = str[i]; } else { sprintf(encoded_str + j, "%%%02X", str[i]); j += 3; } } encoded_str[j] = '\'; printf("Original string: %s\n", str); printf("Encoded string: %s\n", encoded_str); free(encoded_str); return ; } 这段代码将字符串"hello world"转换成了"hello%20world"的形式。 ### 回答2: 将字符转换为`application/x-www-form-urlencoded`格式,可以使用URL编码的方式进行转换。 URL编码是一种将字符串中的特殊字符转换为%xx格式的编码方法,其中xx表示特殊字符在ASCII表中的十六进制表示。在`application/x-www-form-urlencoded`格式中,所有的特殊字符都会被编码。 下面是一个使用Java实现的示例代码: ```java import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class UrlEncodeExample { public static void main(String[] args) { String str = "Hello World!"; try { String encodedStr = URLEncoder.encode(str, "UTF-8"); System.out.println(encodedStr); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } ``` 在上述示例中,我们使用了`URLEncoder`类的`encode`方法将字符串`"Hello World!"`进行编码编码后的字符串为`Hello+World%21`。编码指定了字符集为`UTF-8`。 在`application/x-www-form-urlencoded`格式中,空格将会被转换为`+`号,而特殊字符(如`!`)将会被转换为%xx格式。 你可以根据自己的需求修改上述代码,并将其集成到你的项目中。 ### 回答3: 将字符转换为application/x-www-form-urlencoded格式的过程如下: 1. 首先,将字符串按照要求的格式进行编码。这包括将字符串中的特殊字符进行义,例如将空格编码为%20,将逗号编码为%2C,将斜杠编码为%2F等。 2. 然后,将编码后的字符串中的每个字符转换为字节序列,并使用ASCII码进行表示。 3. 接着,将每个字节序列转换为十六进制表示,并在前面添加%符号。 4. 最后,将所有转换后的字节序列按照顺序连接起来,并以&符号作为分隔符。 举例说明:假设有一个字符串"hello world"需要转换为application/x-www-form-urlencoded格式。按照上述步骤进行转换: 1. 编码字符串,将空格义为%20: "hello%20world"。 2. 将编码后的字符转换为字节序列,并使用ASCII码表示: "h" 为 104, "e"为101, "l"为108, "o"为111,空格为32,以此类推。 3. 将每个字节序列转换为十六进制表示,并添加%符号: 104转换为%68,101转换为%65,108转换为%6C,111转换为%6F,32转换为%20。 4. 将所有转换后的字节序列连接起来,并以&符号作为分隔符: %68%65%6C%6C%6F%20%77%6F%72%6C%64。 最终得到的字符串就是将原始字符转换为application/x-www-form-urlencoded格式的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值