boa-0.94.13:CGI中文问题

为什么中文乱码

         win7自带的浏览器ie打开服务器的cgi_form.html,在Name输入框输入“汉字”两个字,提交服务器。如图1

boa-0.94.13:CGI中文问题_第1张图片

1

         返回的是结果为:

                       Server Got you parametes! Right!? ^_^

                       Name : %BA%BA%D7%D6

                       Email :

                       Message :

         经过查看页面编码(方法:鼠标右键->编码),IE自动选择GB2312编码,即简体中文编码。通过修改页面编码(方法:鼠标右键->编码->Unicode(UTF8)),再次输入“汉字”提交,结果为:

                       Server Got you parametes! Right!? ^_^

                       Name : %E6%B1%89%E5%AD%97

                       Email :

                       Message :

         GB2312编码汉字,一个汉字使用2个字节编码,UTF8编码汉字则用3个字节。这就是同样提交的参数为“汉字”,但是不同页面编码的返回结果有所区别。红色字体部分百分号是非ASCII码的URL编码规则,百分号后面是16进制数。

         但是一般用户不会理解这些乱起八糟的编码,用户只认识汉字。如何能让人类直观看到提交的参数呢?

       第一,  编辑页面的时候,指定页面的编码类型;

       第二,  CGI程序生成结果的时候,也指明编码类型;

       第三,  CGI程序与form页面保持一致的编码格式。

GB2312测试

         cgi_form.html基础上修改页面,指定页面编码格式:

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

         同时NameEmailMessage替换为中文,实际效果如图2

boa-0.94.13:CGI中文问题_第2张图片

2

         因为要将页面汉字编码为GB2312编码,因此如果没能正确修改cgi_form.html达到上图效果的,请下载cgi_form_gb2312.html

         对应的cgi程序这里为了得到url编码中的参数,引入了另一个脚本urldecode.sh。   cgi_form_gb2312.sh内容如下:

                                    #!/bin/sh

                                    eval `./proccgi.sh $*`

                                    param_name=`echo $FORM_name |./urldecode.sh`

                                    param_email=`echo $FORM_email |./urldecode.sh`

                                    param_msg=`echo $FORM_msg |./urldecode.sh`

                                   

                                    thisName=`echo -e '\xD0\xD5\xC3\xFB'`

                                    thisEmail=`echo -e '\xD3\xCA\xCF\xE4'`

                                    thisMsg=`echo -e '\xD0\xC5\xCF\xA2'`

                                   

                                    echo"Content-type:text/html;charset=gb2312"

                                    echo ""

                                    echo ""

                                    echo "CGIGB2312"

                                    echo ""

                                    echo "

Server Got youparametes! Right!? ^_^

"

                                    echo "

$thisName:$param_name

"

                                    echo "

$thisEmail:$param_email

"

                                    echo "

$thisMsg:$param_msg

"

                                    echo ""

                                    echo ""

         具体运行效果如图3

boa-0.94.13:CGI中文问题_第3张图片

3

        

UTF-8测试

         GB2312测试一样,要改编cgi_form.html

         <meta http-equiv="content-type"content="text/html;charset=utf-8" />

         为了方便,这里提供下载测试 cgi_form_utf8.html

         CGI程序,同样要引入urldecode.sh进行URL参数解码。因为urldecode.sh已提供下载,这里只给出对应的CGI程序,cgi_form_utf8.sh

                                    #!/bin/sh

                                    eval `./proccgi.sh $*`

                                    param_name=`echo $FORM_name |./urldecode.sh`

                                    param_email=`echo $FORM_email |./urldecode.sh`

                                    param_msg=`echo $FORM_msg |./urldecode.sh`

                                   

                                    thisName=`echo -e '\xE5\xA7\x93\xE5\x90\x8D'`

                                    thisEmail=`echo -e '\xE9\x82\xAE\xE7\xAE\xB1'`

                                    thisMsg=`echo -e '\xE4\xBF\xA1\xE6\x81\xAF'`

 

                                    echo"Content-type:text/html;charset=utf-8"

                                    echo ""

                                    echo ""

                                    echo "CGIUTF-8"

                                    echo ""

                                    echo "

Server Got youparametes! Right!? ^_^

"

                                    echo "

$thisName:$param_name

"

                                    echo "

$thisEmail:$param_email

"

                                    echo "

$thisMsg:$param_msg

"

                                    echo ""

                                    echo ""

         具体运行效果如图4

boa-0.94.13:CGI中文问题_第4张图片

4

总结

         通过以上2个实验,理解了汉字编码,浏览器页面编码,CGI程序产生指定的编码页面的技术细节,3者要统一起来就能够解决汉字乱码问题。

         同时一个完整的CGI程序不管用何种编程语言实现,都要具有解析URL参数能力,还有具备将百分号+16进制数参数转化为人类可识别参数的能力。如果参数不回传给浏览器,而是作为后台数据库查询条件的话的,还会涉及后台数据库存储的数据格式问题。这就不再本文范围内描述。

         文中重要部分已经红色标示,重点理解这些差异。如果彻底理解这2个例子,以后遇到汉字乱码问题就可以避免了。

你可能感兴趣的:(boa,linux)