用win7自带的浏览器ie打开服务器的cgi_form.html,在Name输入框输入“汉字”两个字,提交服务器。如图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页面保持一致的编码格式。
在cgi_form.html基础上修改页面,指定页面编码格式:
<meta http-equiv="content-type"content="text/html;charset=gb2312" />
同时将Name,Email,Message替换为中文,实际效果如图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 "
echo ""
echo "Server Got youparametes! Right!? ^_^
"
echo "$thisName:$param_name
"
echo "$thisEmail:$param_email
"
echo "$thisMsg:$param_msg
"
echo ""
echo ""
具体运行效果如图3。
图3
跟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 "
echo ""
echo "Server Got youparametes! Right!? ^_^
"
echo "$thisName:$param_name
"
echo "$thisEmail:$param_email
"
echo "$thisMsg:$param_msg
"
echo ""
echo ""
具体运行效果如图4。
图4
通过以上2个实验,理解了汉字编码,浏览器页面编码,CGI程序产生指定的编码页面的技术细节,3者要统一起来就能够解决汉字乱码问题。
同时一个完整的CGI程序不管用何种编程语言实现,都要具有解析URL参数能力,还有具备将百分号+16进制数参数转化为人类可识别参数的能力。如果参数不回传给浏览器,而是作为后台数据库查询条件的话的,还会涉及后台数据库存储的数据格式问题。这就不再本文范围内描述。
文中重要部分已经红色标示,重点理解这些差异。如果彻底理解这2个例子,以后遇到汉字乱码问题就可以避免了。