VB下中文URL编码问题的解决

        因为编码涉及的内容既多且烦,特别是vb的编码,又有诸多限制,所以在解决URL中文编码的时候走了很久的弯路。

问题:

        我的VB客户端需要向web服务器发送数据,在服务器端更新到数据库。但发送的数据中,肯定出现中文。但在服务器端,用request得到的是乱码。

尝试1:

        知道vb中编码都是unicode,试图修改页面中的代码页,如:

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

        无效,因为发送的是URL,是在页面打开之前的。这个选择对URL的解析没有影响。

尝试2:

        找资料,大多是说要将URL编码改为UTF-8编码,因为url接收的都是utf-8,但似乎google接收的是unicode,不管了,下载编码器。如:

        http://www.cnblogs.com/unruledboy/archive/2004/07/18/25286.html

        但总有问题,比如有些字在服务器端无法识别,如“台”被解析成“口”

尝试3:

        在客户端没有办法,就想想服务器端的主意,因为是用asp.net,功能毕竟全面一些,一下就找到

string query = this.Request.Url.Query;
System.Collections.Specialized.NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(query, System.Text.Encoding.GetEncoding("GBK"));

        于是,客户端不进行任何转换,服务器端用能够得到的代码页进行逐个判断:

            foreach (EncodingInfo ei in Encoding.GetEncodings())
             {
                 Encoding e2 = ei.GetEncoding();
                 if(System.Web.HttpUtility.ParseQueryString(query, e2)["F1"]!=null)
                     s += (e2.EncodingName) + System.Web.HttpUtility.ParseQueryString(query, e2)["F1"].ToString() + "------";
            }

        但结果很失败,没有任何一种代码页能够得到和原来一样的中文。

尝试4:用adodb.stream,这个东西我也不熟,但貌似可以在客户端进行unicode和utf-8的转换,找到一个台湾的页面,提到转换方法:

        http://delphi.ktop.com.tw/board.php?cid=31&fid=77&tid=66001

        但我居然无法把它套用到简体环境,我试了几种charset,都不行。

尝试5:只能耐心研究vb的字符串的格式了,找到一篇比较好的文章,看样子又是台湾作者写的!

        http://blog.csdn.net/qunluo/archive/2004/07/22/48682.aspx

        我的理解是:

        vb中的字符串都是unicode编码,即:任何一个字符都是用双字节表示。

        LenB("12魏家台")=8,说明占用8个字节

        用strConv(str,vbfromunicode)可以将串转换为ansi的,即gb2312或者gbk,特点是,中文双字节,英文单字节。

        得到的ansi仍然是字符串,不过在vb下显示是乱码,因为vb会按照unicode的编码去理解它的。如,这时“12”只有2个字节,但vb会认为这时一个unicode字符。

        为了分析这个ansi串,需要将其转换为字节数组。很简单

                 dim byt() as byte
                 byt=sAnsi

        为了比较,我在baidu里百度了一下"12魏家台",得到了其编码是“12%CE%BA%BC%D2%CC%A8”,经验证,每2个16进制数,就是相应的中文的ansi编码。

        终于得到一个结论/办法:把中文转换为ansi,编码为文本串,发送到服务器。在服务器端用GB2312或者GBK代码页解析。

        我没有用大量中文进行测试,只选择了“镕”字测试了一下,结果,可以被服务器正确的识别。

感受:

        vb的确不复当年之勇了,找资料感觉越来越困难了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Java线程面试题 Top 50

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚...

12920
来自专栏腾讯移动品质中心TMQ的专栏

内存泄漏漫谈

对于C/C++来说,内存泄漏问题一直是个很让人头痛的问题,因为对于没有GC的语言,内存泄漏的概率要比有GC的语言大得多,同时,一旦发生问题,也严重的多,而且,内...

31570
来自专栏眯眯眼猫头鹰的小树杈

猫头鹰的深夜翻译:Volatile的原子性, 可见性和有序性

为什么要额外写一篇文章来研究volatile呢?是因为这可能是并发中最令人困惑以及最被误解的结构。我看过不少解释volatile的博客,但是大多数要么不完整,要...

16350
来自专栏智能大石头

多线程带智能采集策略的采集系统

    去年年底的时候曾经发过一个数据采集器《网页数据采集器》,那是专门针对某一个网站来进行采集的,如果需要采集新的网站内容,就需要修改代码并重新编译。    ...

22780
来自专栏Java帮帮-微信公众号-技术文章全总结

回顾Java 8 9 10的新特性,展望即将来临的11和明年的12【大牛经验】

1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议纪录;

1.6K30
来自专栏杨建荣的学习笔记

从sysbench中学习Lua

我做事喜欢结果导向,喜欢快速迭代,能10分钟搞定,绝对不愿意花15分钟。但是技术行当,还是得耐得住寂寞,因为很多事情10分钟搞不定,可能100分钟,100...

32350
来自专栏北京马哥教育

编写Linux Shell脚本的最佳实践

来自:Myths的个人博客 作者:myths 链接:https://blog.mythsman.com/2017/07/23/1/(点击尾部阅读原文前往) 前言...

42090
来自专栏ascii0x03的安全笔记

SEED缓冲区溢出实验笔记——Return_to_libc

参考:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Return_to_libc/      ht...

34260
来自专栏JavaEdge

JSP必备知识点servlet VS CGI如何实现 servlet 单线程模式servlet 页面间对象传递的方法有几种jsp VS servlet<jsp:include page=”includ

37160
来自专栏技术博客

编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]

  自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过。迄今为止,CLR异常机制让人关注最多的一点就是“效率”问题。其实,这里存在认识上的误区,因为正...

12320

扫码关注云+社区

领取腾讯云代金券