测试地址:http://www.dazhongcai.com/test/index.php?cs=我爱中国
问题是这样的,我直接打开http://www.dazhongcai.com/test/index.php?cs=我爱中国,$_GET['cs']是乱码的。
而从<a href="?cs=我爱中国">我爱中国中文链接</a>点击打开,$_GET['cs']却是正常的。网上说有用iconv,用后结果变成:
我直接打开http://www.dazhongcai.com/test/index.php?cs=我爱中国,$_GET['cs']是正常的。
而从<a href="?cs=我爱中国">我爱中国中文链接</a>点击打开,$_GET['cs']却是乱码的。utf-8 下这个就没有解决的办法了吗?
问题是这样的,我直接打开http://www.dazhongcai.com/test/index.php?cs=我爱中国,$_GET['cs']是乱码的。
而从<a href="?cs=我爱中国">我爱中国中文链接</a>点击打开,$_GET['cs']却是正常的。网上说有用iconv,用后结果变成:
我直接打开http://www.dazhongcai.com/test/index.php?cs=我爱中国,$_GET['cs']是正常的。
而从<a href="?cs=我爱中国">我爱中国中文链接</a>点击打开,$_GET['cs']却是乱码的。utf-8 下这个就没有解决的办法了吗?
编码下..
我从网址直接打开http://www.dazhongcai.com/test/index.php?cs=我爱中国
怎么去编译参数?编译解决不了这个问题(且编译也试过了,问题照旧)
第二个页面加上这个
我直接打开http://www.dazhongcai.com/test/index.php?cs=我爱中国,$_GET['cs']是正常的。
而从 <a href="?cs=我爱中国">我爱中国中文链接 </a>点击打开,$_GET['cs']却是乱码的。 楼主你不会都对 我爱中国 进行了iconv 吧?
只对http://....用不就对了吗?
在对<a href="..">时不用iconv不就对了吗
比如你那个链接,明显是GBK编码的,因为urlencode后为8个 %16进制,正好2个字节一组表示一个中文,而中文在utf-8编码下基本都是3个字节的
echo "Icov转换的:".iconv("GBK","utf-8",$_GET["cs"])."<br/>";
不是这很明白你的解决方法望指点!
http://www.dazhongcai.com/test/index.php?cs=我爱中国
好了,这个时候,你指定了页面的编码
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
这个意思就是浏览器发送请求头到index.php,获取返回内容后,浏览器希望用utf-8编码去识别这个"我爱中国".
但是返回内容是按照它实际物理编码获取到的,所以获取到的"我爱中国"(实际为GBK编码).
这时候就发送乱码行为了。用utf-8编码去读gbk编码的东西,岂不是鸡同鸭讲?
要么你把"我爱中国"这个获取到的内容进行转码,从gbk转到utf-8,要么指定浏览器用gbk编码去识别获取到的数据。
其实你保证你的index.php文件编码也是utf-8就行了?
urldecode函数有注入漏洞,我现在不敢用了。
页面文件的格式也是utf-8(用记事本另存为的),页面编码指定的也是utf-8。我现在已经没有办法了。
还有url中出现中文会自动进行一次转码.所以iconv转$_GET中的gbk数据是有问题的。应该在传参之前转码。用一个小例子说明问题可能更好理解点。
<?php
header('Content-Type:text/html;charset=utf-8');
$k = iconv("GBK","UTF-8","我爱中国");
print_R($_GET);
echo "<a href='?c={$k}'>我爱中国</a>";
?>
你把以上这段代码存成一个gb2312的文件,然后用浏览器浏览此文件。会发现<a>标签内的"我爱中国"是乱码,就是因为用utf-8去读gbk,然后点击"我爱中国",会发现$_GET到的是正常的。
header('Content-Type:text/html;charset=GBK');
$k = "我爱中国"
//$k = iconv("GBK","UTF-8","我爱中国");
print_R($_GET);
echo "<a href='?c={$k}'>我爱中国</a>";
?>
依然保持gb2312编码文件,一切正常。然后把文件存为utf-8的,你再试下以下代码
<?php
header('Content-Type:text/html;charset=gbk');
$k = "我爱中国";
$k = iconv("utf-8","gbk", $k);
print_R($_GET);
echo "<a href='?c={$k}'>我爱中国</a>";
?>
这时候,<a>标签内的是乱码,$_GET到的正常,因为进行了正确的转码。
页面链接显示是正常的中文参数,因为所有的编码都是一致的utf-8,并且点击相应的链接,中文也可以url传递且正常接收。
现在问题是手工打开包含中文参数的url时(即无父来源页),中文参数就不能获取了。(这种情况在页面gb2312下是没有的)
这么说实际上你的页面是正常的了。不太清楚"手工打开包含中文参数的url时(即无父来源页),中文参数就不能获取了",手工打开页面是什么意思?程序发送socket连接?
手工打开包含中文参数的url时(即无父来源页),中文参数就不能获取了",意思就是直接打开那个链接地址,或者从收藏里打开那个链接地址。
MySQL 中文显示乱码
你直接在浏览器地址栏里敲入地址,这个是纯粹的浏览器行为了.
实际上你给的http://www.dazhongcai.com/test/index.php?cs=我爱中国 这个地址,进去后,你只需要在地址栏敲下回车,就发现参数给转码了,转成什么编码?应该是跟操作系统相关.
我记得ie浏览器下 internet选项->高级 里面有个以utf-8发送url来着,你用ie,然后勾选上这个选项,再测试你的例子看看
在地址栏里敲入about:config->然后查找 network.standard-url.encode-query-utf8 这项,双击设置为true,再测试你的例子.
network.standard-url.encode-utf8 这一项也要设置为 true
难道客户发现这个问题然后认为是你系统的bug?那只有深深的无语...
那么中文编码也就是 gbk 和 utf-8 两种了
看了你的测试页面,meta 中有 charset=utf-8 也就是说你期望使用 utf-8 编码来处理信息
但当在地址栏输入了 gbk 编码的文字后,程序就不能识别了。(其实这不是你才会遇到的,百度、google都有这个问题)
为此,你需要在处理程序中检查传入的文字是何种编码的,若不是 utf-8 的时候就进行编码转换
mb_detect_encoding在这种情况下是用不了的.
utf-8中文一般三个字节,使用对应的unicode模版为
1110xxxx 10xxxxxx 10xxxxxx
x为unicode编码,所以中文utf-8第一个字节的首4位必为16进制的e,第一个字节范围就是e0 - ef
尝试下面的代码
<?php
header('Content-Type:text/html;charset=utf-8');
$k = '我爱中国';
if(!preg_match("/[\xe0-\xef][\x80-\xbf]{2}/",$_GET['c'])){
//找不到utf-8编码的文字就默认为GBK,当然你可以参考gbk的编码格式,做更详细的判断
echo iconv("GBK","UTF-8",$_GET['c']);
}
else
echo $_GET['c'];
echo "<a href='?c={$k}'>我爱中国</a>";
?>
存为utf-8无bom头文件,然后做下测试.