Home  >  Article  >  php教程  >  PHP URL传递中文乱码问题解决办法

PHP URL传递中文乱码问题解决办法

WBOY
WBOYOriginal
2016-05-25 16:51:561383browse

在使用 ?id="中文" 传递中文参数时,出现了乱码,这是经过了二次转码后的结果,其中,在 php 中,url 中是不可以直接传输中文的,对于这点,一直心存不满,没办法呀,谁让咱没一套解决方案呢,不知道别的语言是不是也出现这样的问题。

对于网上所说的在首页添加 header("content-type:text/html;charset=utf-8"); 这样的代码,以及把数据库页面等等设置成 utf8 的解决方案根本无效,始终传递过来的中文是乱码。

尽管所有04ie.com站点PHP  我都是用的统一的 utf8 编码,但始终传递过去是乱码,后来测试了几个浏览器,发现 360 可以传递过去,而 IE 不行,后来再使用 $msg = iconv("gbk",'utf-8",$_GET["msg"]); 进行转换,测试几个浏览器后,大多还是显示乱码的问题。

最后总结了一点,对于 GET[] 过去的值,url 中不可以直接传输中文,如果必须要传输的话,用 urlencode() 方法来处理中文。对于 POST[]  不知道怎么样,暂时还没有做过实验。

再来PHP手册上查下urlencode()的使用:urlencode() 本函数将字符串以 URL 编码。例如空格就会变成加号。Homepage 中 form 资料传送就是用 urlencode 编码后再送出

原来如此,我说呢为什么从form表单提交过来的就没有问题,但是url传递过来的就乱码

本工具分别实现两种方式的Encode与Decode:

中文 -> GB2312的Encode -> %D6%D0%CE%C4

中文 -> UTF-8的Encode -> %E4%B8%AD%E6%96%87

Html中的URLEncode:

编码为GB2312的html文件中:/中文.rar -> 浏览器自动转换为 -> /%D6%D0%CE%C4.rar

注意:Firefox对GB2312的Encode的中文URL支持不好,因为它默认是UTF-8编码发送URL的,但是ftp://协议可以,我试过了,我认为这应该算是Firefox一个bug。

编码为UTF-8的html文件中:/中文.rar -> 浏览器自动转换为 -> /%E4%B8%AD%E6%96%87.rar

PHP中的URLEncode:

<?php
//GB2312的Encode
echo urlencode("中文-_. ") . "\n"; //%D6%D0%CE%C4-_.+
echo urldecode("%D6%D0%CE%C4-_. ") . "\n"; //中文-_.
echo rawurlencode("中文-_. ") . "\n"; //%D6%D0%CE%C4-_.%20
echo rawurldecode("%D6%D0%CE%C4-_. ") . "\n"; //中文-_.
?>

除了"-_."之外的所有非字母数字字符都将被替换成百分号"%"后跟两位十六进制数。

urlencode和rawurlencode的区别:urlencode将空格编码为加号"+",rawurlencode将空格编码为加号"%20"。

如果要使用UTF-8的Encode,有两种方法:

一、将文件存为UTF-8文件,直接使用urlencode、rawurlencode即可。

二、使用mb_convert_encoding函数:

<?php
$url = &#39;/中文.rar&#39;;
echo urlencode(mb_convert_encoding($url, &#39;utf-8&#39;, &#39;gb2312&#39;)) . "\n";
echo rawurlencode(mb_convert_encoding($url, &#39;utf-8&#39;, &#39;gb2312&#39;)) . "\n";
//http%3A%2F%2Fs.%2F%E4%B8%AD%E6%96%87.rar
?>

实例代码如下:

<?php
function parseurl($url = "") {
    $url = rawurlencode(mb_convert_encoding($url, &#39;gb2312&#39;, &#39;utf-8&#39;));
    $a = array(
        "%3A",
        "%2F",
        "%40"
    );
    $b = array(
        ":",
        "/",
        "@"
    );
    $url = str_replace($a, $b, $url);
    return $url;
}
$url = "ftp://ud03:password@s./中文/中文.rar";
echo parseurl($url);
//ftp://ud03:password@s./%D6%D0%CE%C4/%D6%D0%CE%C4.rar
?>

JavaScript中的URLEncode:

如:%E4%B8%AD%E6%96%87-_.%20%E4%B8%AD%E6%96%87-_.%20

encodeURI不对下列字符进行编码:":"、"/"、";"、"?"、"@"等特殊字符。

如:/%E4%B8%AD%E6%96%87.rarhttp%3A%2F%2Fs.%2F%E4%B8%AD%E6%96%87.rar

看来也只有用 urlencode() 方法来处理中文了,在传递之前要先进行编码,传递过去之后再进行解决就可以了,那么利用如下两个函数:编码:".urlencode("中文").",解码:".urldecode("中文").",括号里的中文就是传递的字符了。

如下:传递页面先进行04ie.com编码:td.php?id=".urlencode("中文").",接受页面进行解码即可:urldecode(id).",附一个函数:

if (preg_match("/^([".chr(228)."-".chr(233)."]{1} [".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1})+$/",$msg)) //如果$msg是UTF-8编码 
{ 
$msg = iconv("UTF-8","GB2312",$msg); //将 $msg 由UTF-8编码转为GB2312编码 
}


本文链接:

收藏随意^^请保留教程地址.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn