彻底解决网络传输过程中出现的中文乱码问题
2009-06-16 00:37
766 查看
很奇怪的事情,有页面 index.asp 为UTF-8页面,用Ajax发送参数
"name="+escape("朝歌")+"&id=23" 到页面 resource.asp (gb2312)后,返回
vbsEscape(“中文”)后,AJAX在unescape后居然能读出汉字,这个太神奇了,最后才知道原来escape和unescape这两个算法是互为解密和加密的两个程序,不受编码影响(也就是不管在UTF-8还是gb2312中,其结果是互相唯一的),因为很多时候编码出现故障都是因为中文编码而出现的,现在由于此两个程序把中文编成普通的字符,所以传输过程中不会乱,发出去的是普通字符,根据算法逆运算就可以得出真正的字符.
现在贴出ASP和JAVA的escape和unescape函数
vbscript
java
"name="+escape("朝歌")+"&id=23" 到页面 resource.asp (gb2312)后,返回
vbsEscape(“中文”)后,AJAX在unescape后居然能读出汉字,这个太神奇了,最后才知道原来escape和unescape这两个算法是互为解密和加密的两个程序,不受编码影响(也就是不管在UTF-8还是gb2312中,其结果是互相唯一的),因为很多时候编码出现故障都是因为中文编码而出现的,现在由于此两个程序把中文编成普通的字符,所以传输过程中不会乱,发出去的是普通字符,根据算法逆运算就可以得出真正的字符.
现在贴出ASP和JAVA的escape和unescape函数
vbscript
Function Escape(str) dim i,s,c,a s="" For i=1 to Len(str) c=Mid(str,i,1) a=ASCW(c) If (a>=48 and a<=57) or (a>=65 and a<=90) or (a>=97 and a<=122) Then s = s & c ElseIf InStr("@*_+-./",c)>0 Then s = s & c ElseIf a>0 and a<16 Then s = s & "%0" & Hex(a) ElseIf a>=16 and a<256 Then s = s & "%" & Hex(a) Else s = s & "%u" & Hex(a) End If Next vbsEscape = s End Function Function UnEscape(str) dim i,s,c s="" For i=1 to Len(str) c=Mid(str,i,1) If Mid(str,i,2)="%u" and i<=Len(str)-5 Then If IsNumeric("&H" & Mid(str,i+2,4)) Then s = s & CHRW(CInt("&H" & Mid(str,i+2,4))) i = i+5 Else s = s & c End If ElseIf c="%" and i<=Len(str)-2 Then If IsNumeric("&H" & Mid(str,i+1,2)) Then s = s & CHRW(CInt("&H" & Mid(str,i+1,2))) i = i+2 Else s = s & c End If Else s = s & c End If Next vbsUnEscape = s End Function
java
public String escape(String src) { int i; char j; StringBuffer tmp = new StringBuffer(); tmp.ensureCapacity(src.length() * 6); for (i = 0; i < src.length(); i++) { j = src.charAt(i); if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j)) tmp.append(j); else if (j < 256) { tmp.append("%"); if (j < 16) tmp.append("0"); tmp.append(Integer.toString(j, 16)); } else { tmp.append("%u"); tmp.append(Integer.toString(j, 16)); } } return tmp.toString(); } public String unescape(String src) { StringBuffer tmp = new StringBuffer(); tmp.ensureCapacity(src.length()); int lastPos = 0, pos = 0; char ch; while (lastPos < src.length()) { pos = src.indexOf("%", lastPos); if (pos == lastPos) { if (src.charAt(pos + 1) == 'u') { ch = (char) Integer.parseInt(src .substring(pos + 2, pos + 6), 16); tmp.append(ch); lastPos = pos + 6; } else { ch = (char) Integer.parseInt(src .substring(pos + 1, pos + 3), 16); tmp.append(ch); lastPos = pos + 3; } } else { if (pos == -1) { tmp.append(src.substring(lastPos)); lastPos = src.length(); } else { tmp.append(src.substring(lastPos, pos)); lastPos = pos; } } } return tmp.toString(); }
相关文章推荐
- 解决网络传输的过程中,出现乱码的问题
- 在控制器中添加过滤器,解决中文由jsp到action进而到数据库传输过程中出现的乱码问题(Struts)
- 中文乱码错误(网页中、与服务器传输信息中出现的中文问题解决方案)
- 彻底解决get显示提交时,参数中包含中文时出现乱码的问题
- Servlet传输过程中解决中文乱码问题
- 有关我在SSHD(SSH三大框架和DWR框架)整合过程中出现的中文乱码问题的解决
- 解决页面之间传输中文值时出现乱码的问题
- 四步解决Linux系统中出现中文乱码问题
- 升级tomcat后出现的页面录入框中文乱码问题解决方法
- 解决StreamReader读取中文出现乱码的问题
- 网络通信的中文乱码问题及解决方法
- 彻底解决Spring MVC 中文乱码 问题
- 解决zabbix图中出现中文乱码问题
- CentOS 6.4中出现Vsftpd中文乱码解决过程
- jsp页面写入中文到mysql时出现乱码 问题解决
- JS通过get、post向jsp传递中文出现乱码的问题的解决
- Android Studio控制台出现中文乱码(方框)问题解决办法
- 解决方法:ASP读取数据库中的中文数据出现乱码的问题
- 彻底解决Git中文乱码问题
- JSP MySQL插入数据时出现中文乱码问题的解决方法