电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

URL的传递字符串问题小研究


发布日期:2018/8/22
 

前几天在调程序的时候遇到了比较郁闷的问题我用URL从一个页面传递字符串到另一个页面的时出现了个奇怪的问题我要传递的字符串是DK+中继站可是另一个页面接收到字符串却是DK 中继口加号变成了空格不能解析出来变成了不能识别的符号

我上网查找了原因URL中有些字符被转义比如空格被编码成加号于是传的参数明明是加号获取的值却成了空格

按照网上的建议我们应该对要传递的参数进行编码处理于是我对传递的参数进行了处理但是又衍生了一堆问题出来我当时为了节约时间就没有仔细研究用了字符串中的Replace()方法在传送前代替了这两个字符接收到了再代替回来现在我来具体的展示下这个问题

首先我们先看下我的开始的问题(环境VS 新建一个网站在其中添加一个页面一个页面是Defaulaspx另一个页面Defaulaspx在第一个页面中添加一个控件HyperLink后台代码

在第二个页面中添加一个Label控件Label后台代码

结果显示DK 中继口

我当时的解决方法用了字符串中的Replace()方法在传送前代替了这两个字符接收到了再代替回来

第一个页面的后台代码第二个页面中后台代码

结果是DK+中继站正确!

后来我在网上找到这个这样的设置在nfig中设置

这样的话就不需要替代中文了只需要把+替代中文在这个过程就不会出现问题了

但是这样的传递中文可能还会遇到其他中文字出问题最好是采用下面的方法将中文参数编码

我采用URLEncode()编码采用URLEncode()不在nfig中设置好像也可以在我的测试中没有问题但是为了安全我们还是添加上上面的设置

页面上都是一致的第一页面的后台代码第二个页面中后台代码

结果是DK+中继站正确!

后来我在网上找到这个这样的设置在nfig中设置

这样的话就不需要替代中文了只需要把+替代中文在这个过程就不会出现问题了

但是这样的传递中文可能还会遇到其他中文字出问题最好是采用下面的方法将中文参数编码

我采用URLEncode()编码采用URLEncode()不在nfig中设置好像也可以在我的测试中没有问题但是为了安全我们还是添加上上面的设置

页面上都是一致的第一页面的后台代码

第二页面的后台代码

结果是DK+中继站正确!

注意一定要前后对应比如在这里第一页面中是先编码的后替代第二页面中就要先替代再解码不然就会出错DK 中继站

我在开头提到遇到了比较多的问题 网上的资料有的说是用%来替代+但是我尝试了下结果却是错误的 DK 中继站这是什么原因呢?是网上说错了吗?但是在下面的情况中又很让我苦笑不得不知道具体是什么原因

接上面还是用%来替代+我在一次错误的输入在第一页面后台输入了name = ServerUrlEncode(name)第二页面中解码是 name = ServerHtmlDecode(name)居然是结果对的DK+中继站我换了其他的替代字符结果也是正确的

但是我换了其他编码和解码组合ServerHtmlEncode(name)和ServerUrlDecode(name)或者ServerHtmlEncode(name)和ServerHtmlDecode(name)组合结果就不对连中文都不对DK 中继口

我采用ServerHtmlEncode(name)和ServerHtmlDecode(name)组合要得到正确的结果必须用像@这样的特殊字符来替代+当然还有在nfig中添加设置设置内容如上

我在查资料的时候还有提到一种方法不需要在nfig中添加设置在aspx文件中添加<meta httpequiv=ContentType content=text/html charset=gb>我尝试了没成功

我还有个疑问是在这里我是用@的特殊字符来代替+因为在我的字符串中是不可能出现@才这样做的但是如果我的字符串中可能出现这些特殊字符串我又该如何替代呢?

我在经历了这些测试后觉得最安全的方法在URL中传递参数时最好还是使用URLDecode()方法在nfig中配置上

配置这个是需要注意你的程序中的字符集是不是也用这个gb来编码解码的如果不是就要注意了可能引发的错误了我在程序中就遇到了这个问题我的程序中的画面就是用xml传递的我加了这个设置后就不能显示画面我找了很长时间才知道是是两种编码规则沖突我画面中设置的UTF被全局变量复制了

今天理解到了测试时需要很有耐心的在这个问题中正确的方法就是可能就是一两种但是为了测试错误的情况我做了七八种情况比如URLEncodeURLDecode和HtmlEncodeHtmlDecode的组合问题传递时和接收时编码替代解码的先后顺序这些花了很多时间头都绕晕了本来想把所以的过程都写出来的但是考虑到篇幅太多了还是就写这些希望大家能有好的建议

上一篇:ado extentsion绑定recordset冗余变量问题

下一篇:使用NBear创建EntityDesign实体类