LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1750|回复: 6

请教c++的问题(汉字的url解码)?

[复制链接]
发表于 2003-8-4 15:11:10 | 显示全部楼层 |阅读模式
cgi脚本,怎么才能让从网页传来的汉字正常的输入mysql数据库呢?

提取英文没有问题,但汉字全是%C5等等。哎!!!!!!

帮我呀!!!!!!
发表于 2003-8-4 19:11:15 | 显示全部楼层
URL解码

由于WEB服务器和浏览器对于一些特殊的字符不能正确处理,WEB服务器和浏览器之间可能会由此产生而某种程度的误会,因此在数据被传送之前,浏览器都要对表单内客户输入的数据中的特殊字符进行URL译码。
例如WEB系统用“=”分解表单各元素的NAME和VALUE属性,用“&”分解不同表单元素的输入数据,如果在表单的输入数据中包含这些特殊的字符,并且表单的数据在传送给WEB服务器前不做任何处理,WEB服务器将无法知道哪一个“=”、“&”是用户输入的,哪一个是浏览器加的。在由表单属性ACTION定义的URL中,也可能出现一些特殊的字符,当在CGI程序的名称中和路径信息(Path Information)中出现象“=”、“&”和“?”时,都会影响数据的正确传送。

URL译码(URL Encoding)就是将WEB服务器所不能正确处理的特殊字符转换成它的十六进制数的形式,比如将“%”转换成“%25”、“=”转换成“%3D”等等。这些特殊的字符通常被称为WEB系统的保留字符。通常在WEB系统上不论是用GET方法还是用POST方法传送的数据都要进行URL译码。CGI程序要想处理表单传送来的数据,还必须对浏览器URL译码过的数据进行解码,理解URL译码对对于我们进行CGI编程是非常重要的。一般URL译码的步骤如下:

1. 浏览器将所传送的数据根据表单所包含的元素分解成“NAME=VALUE”的形式,NAME和VALUE分别是表单元素的属性,其中VALUE属性中存储客户方在表单中输入的数据,如果客户方没有输入数据,则VALUE存储的是表单定义的缺省值,如果缺省值也没有定义,则VALUE值为空;

2. 代表表单中各元素的各个“NAME=VALUE”对被浏览器用“&”连接起来;

3. VALUE属性中存放的数据若含有空格,则被转换成“+”;

4. URL和输入数据中所包含的WEB系统的保留字符必须被译码成它们的十六进制数的形式。

5. 被译码后的字符被表示成一个“%”和它们的十六进制数(%HH)。

CGI程序从环境变量“QUERY_STRING”或标准输入中读入的数据是经过浏览器URL译码的,在使用
这些数据以前还必须对它们进行URL解码。解码的目的就是将数据还原成客户在WEB页面上输入时的形式。本文已经介绍了URL译码,URL解码和它正相反,一般它有以下的工作要做:

1. 从浏览器用GET或POST方法所传送来的数据中找出代表各个表单元素所储存数
据的“NAME=VALUE”对。

2. VALUE属性中存放的数据若含有“+”,则被转换成空格。

3. 将VALUE属性中存放的数据的十六进制数“%HH”转换成相应的字符。

WEB系统将汉字当成特殊的字符,对它也要进行URL译码。对于一个特殊的单字节字符比如“/”,浏览器通常将它译码成十六进制数的形式比如%2F,“%”表示它后面跟的是两位十六进制数。当VB程序对其进行处理时调用Chr$函数就可以将其恢复为原来的面貌。而一个汉字则被浏览器译码成四位十六进制数,比如%D5%C5,如果CGI程序还象以前一样分别调用Chr(D5)和Chr(C5),由于D5、C5都不是正常的单字节十六进制数码,Chr函数返回空,汉字将无法正确还原。正确的作法应该是将有关汉字的四位十六进制数一起传给函数Chr,如Chr(D5C5),此时汉字才能被正确还原。

因此可以让CGI程序对四位连续的十六进制数一起进行译码以使汉字被正确还原。但在这种情况下当客户端用户输入了两个连续的WEB系统保留字符时CGI程序又可能把它们当成汉字来处理。这时可以让CGI程序在需要对四位连续的十六进制数进行译码时首先检查前面两位是否为WEB系统的保留字符,如果是则仍然按照单字节的字符处理。不过如果客户端用户在表单内填写了很多汉字,CGI程序的负担将会大大加重。事实上大多数情况下客户端用户很少会使用两个连续的WEB系统的保留字符,可以只让CGI程序对最容易出现的情形如“://”(当客户端用户在表单中输入某一URL时会出现这种情况)进行检查,本文下节提供的函数UrlDecode( )可以实现对汉字和WEB系统保留字符的URL解码。
发表于 2003-8-4 19:29:22 | 显示全部楼层
我用google搜索“你好”,地址栏中出现这个:“http://www.google.com/search?q=%E4%BD%A0%E5%A5%BD&sourceid=opera&num=0&ie=utf-8&oe=utf-8”
其中的%E4%BD%A0%E5%A5%BD是“你好”的utf-8码吗?
 楼主| 发表于 2003-8-4 22:44:45 | 显示全部楼层
谢谢版主,上面的这篇文章在哪可以下载啊?谢谢!
发表于 2003-8-4 23:06:49 | 显示全部楼层
用google搜索”url解码+汉字“。
发表于 2003-8-4 23:19:05 | 显示全部楼层
to kj501
是utf8。
建一个文件nh,写入“你好”两个字,用"iconv -f gb2312 -t utf8 nh > nh-u"转换一下,就是E4BDA0E5A5BD
也可以用 echo "你好" | iconv -f gbk -t utf8 | od -t xC
发表于 2003-8-5 08:13:45 | 显示全部楼层
呵呵,libinary兄真是知识渊博,见多识广。谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表