真的出鬼了!PHP接收网址中的中文参数,永远乱码! 本帖最后由 default7 于 2011-05-25 22:05:57 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以先把需要传递的内容使用自定义的加密函数加密一下再传递,然后传递完接收之后再解密回原来的内容就行了,这就不存在编码问题了.我记得这个加密解密的函数在discuz的程序里边有,你可以找找看 这样做是为了SEO,把关键词写在网址里面重写,如果加密…… 我测试了一下,发现可以直接传递中文,我的做法是:1,用editplus新建php文件,保存的时候文件编码一定要选择utf82,该php的文件头也要设置为utf8,即<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />这样在地址栏传参数的时候就可以是中文不乱码了. 那是浏览器的设置大部分浏览器,都可设置,url参数默认编码,,通常默认为utf-8程序处理,你可以判断下字符是否是所期待的编码,否则转换一下 我的网页文档编码是UTF-8,数据库连接是UTF8,但是就是接收不了。最后在接收的地方用mb_convert_encoding 才可以了。但是我另外一个程序却可以直接用urldecode来获取就可以了。DeDeCMS的/tags.php文件,tags.php?tag=中国人民解放军 这样直接输入这样带中文的网址就解码不了。 大哥,您就先将汉字转化成url编码。 然后再转换回来就不会了 你用chrome试一下,试完之后你就知道是跟浏览器的机制有关的或者这样说:你的中文在哪里输入,就跟输入框本身的编码机制相同 %D6%D0%B9%FA%C8%CB%C3%F1%BD%E2%B7%C5就是 gbk 编码的 中国人民解放军 的 url 编码如果你是在地址栏键入 kw.php?kw=中国人民解放军那么很正常,因为你总是在使用简体中文版操作系统如果这个 url 是写在程序文件中的,那么请核查该文件是否确被以 utf-8 编码保存了 ……真的是出鬼了。本地服务器localhost的直接urldecode就可以了,但是远程的却不行。但是我另外一个网站的却是可以直接用urldecode来接收就可以了的。是这样,a.php里面有一个连接 是 <a href="tags.php?tag=%D6%D0%B9%FA%C8%CB%C3%F1%BD%E2%B7%C5%BE%FC">中国人民解放军</a>,但是在 tags.php里面却(1)远程服务器里面:用urldecode 得到的tag参数还必须换成 UTF-8编码的转码一次。(2)本地localhost里:直接用urldecode 就可以得到tag参数的值,无需转码。另外我发现这些编码都被变成了GB系列的URLENCODE编码,很奇怪的。 (1)远程服务器里面:用urldecode 得到的tag参数还必须换成 UTF-8编码的转码一次。被接收的URL系统是否GBK ,远程服务器是否UTF-8;这样可能出现乱码(2)本地localhost里:直接用urldecode 就可以得到tag参数的值,无需转码。本地编码环境一致 首先,url 编码的转换默认是浏览器和web服务器的工作,并不需要人工干预你在程序或地址栏写入 kw.php?kw=中国人民解放军虽然你看到地址栏中是 url 编码, 但在 kw.php 中 echo $_GET['kw']; 依然是 中国人民解放军除非你显式的使用 urlencode 进行编码,接收时才需要用 urldecode 解码如果你在程序中写入<a href="tags.php?tag=%D6%D0%B9%FA%C8%CB%C3%F1%BD%E2%B7%C5%BE%FC">中国人民解放军</a>那么,无论你的程序文件使用什么语言编码,接收到的只是 gbk 编码的 中国人民解放军 是的,很奇怪。远程的里面这个加密的urlencode 都是自动成了GBK系列的。但是我的本地不是的。本地的是直接urlencode ,看的是文件的编码是UTF-8还是ANSI。这个是否和远程主机有关系呢?远程是linux 系统 Apache 的。我本地 WIN XP ,Apache 系统的。环境是否是UTF-8,这个是如何看啊,在哪里设置。我也觉得是跟配置环境有关系。 用FF下的HTTPFOX,IE的httpwatch都能看到字符集!自己的本地端还看浏览器的默认编码,查看字符编码里面就能显示,最新的FF4。1版本默认就是UNICODE字符编码,而其他浏览器未必一样! 1.%D6%D0%B9%FA%C8%CB%C3%F1%BD%E2%B7%C5%BE%FC 本来就是gb编码(实际应该说ansi)2.服务器有预定义字符集的,只能说你的localhost预定义gbk或者默认跟系统一样,远程那个不是,像我用的免费空间预定义是ISO-8859-1... 我一般都是显示的url编码,接收时候在转回来 …… 我可能越描述越乱了。涉及主机:(1)本地主机站点LOC,(2)远程主机站点FTP涉及文件:(1)a.php [里面有一个连接连接到b.php的,该连接的网址中带的参数中包含中文](2)b.php [里面有接收来自a.php的传递过来的参数,要求输出本来的传递值]出现问题,必须如下情况才可以让b.php接收成功来自于a.php的值:(1)本地情况 <?// a.php内容 $str = '中国人民解放军';echo '<a href="b.php?tag='.urlencode($str).'">'.$str.'</a>';?><?php //b.php 使用如下可以接收到a.php传递过来的值$str = urldecode( trim($_GET["tag"]) );?>(2)远程情况<?// a.php内容 $str = '中国人民解放军';echo '<a href="b.php?tag='.urlencode($str).'">'.$str.'</a>';?><?php //b.php 使用如下可以接收到a.php传递过来的值,必须转码才行$str = urldecode( trim($_GET["tag"]) );$str = mb_convert_encoding($str,"UTF-8","GBK");?>然后本地和远程里面a.php 里面出来的urlencode的值都是一样的。 因为 a.php 是 ansi 保存的 a.php 和 b.php 本地远程都是 以 “UTF-8 NONE BOM HEADER”保存的。 兄弟糾結了半年了還在糾結?答案就在你的條件裏远程是linux 系统 Apache 的。我本地 WIN XP ,Apache 系统的。我曾經在以前碰過,兩臺服務器,一臺linux 一臺win,一樣是編碼問題 然後需要不同的處理。具體應該是跟系統的字符集什麼的有關,上面有人說了。 机器是不会骗人的。不会见鬼,只是见bug.让你们管运维的。把这个配置去了就行。AddDefaultCharset UTF-8 sql的优化 关于require (strtolower($object) . '.class.php')的问题 求这段代码的详解 急!请问如何才能捕捉到这个跳转页面? PHP基础 localhost:8080 php文件转化成 html文件问题,在线等 兄弟姐妹们都来看一下 远程打开ftp上的文件 有谁在php中使用过DSA数字签名 PHP中关于SESSION的问题 php 变量问题 一段php判断的代码
我记得这个加密解密的函数在discuz的程序里边有,你可以找找看
1,用editplus新建php文件,保存的时候文件编码一定要选择utf8
2,该php的文件头也要设置为utf8,即
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
这样在地址栏传参数的时候就可以是中文不乱码了.
我的网页文档编码是UTF-8,数据库连接是UTF8,但是就是接收不了。
最后在接收的地方用mb_convert_encoding 才可以了。
但是我另外一个程序却可以直接用urldecode来获取就可以了。DeDeCMS的/tags.php文件,tags.php?tag=中国人民解放军 这样直接输入这样带中文的网址就解码不了。
就是 gbk 编码的 中国人民解放军 的 url 编码如果你是在地址栏键入 kw.php?kw=中国人民解放军
那么很正常,因为你总是在使用简体中文版操作系统如果这个 url 是写在程序文件中的,那么请核查该文件是否确被以 utf-8 编码保存了
……
真的是出鬼了。
本地服务器localhost的直接urldecode就可以了,但是远程的却不行。但是我另外一个网站的却是可以直接用urldecode来接收就可以了的。是这样,a.php里面有一个连接 是 <a href="tags.php?tag=%D6%D0%B9%FA%C8%CB%C3%F1%BD%E2%B7%C5%BE%FC">中国人民解放军</a>,但是在 tags.php里面却
(1)远程服务器里面:用urldecode 得到的tag参数还必须换成 UTF-8编码的转码一次。
(2)本地localhost里:直接用urldecode 就可以得到tag参数的值,无需转码。另外我发现这些编码都被变成了GB系列的URLENCODE编码,很奇怪的。
虽然你看到地址栏中是 url 编码, 但在 kw.php 中 echo $_GET['kw']; 依然是 中国人民解放军
除非你显式的使用 urlencode 进行编码,接收时才需要用 urldecode 解码如果你在程序中写入
<a href="tags.php?tag=%D6%D0%B9%FA%C8%CB%C3%F1%BD%E2%B7%C5%BE%FC">中国人民解放军</a>
那么,无论你的程序文件使用什么语言编码,接收到的只是 gbk 编码的 中国人民解放军
是的,很奇怪。远程的里面这个加密的urlencode 都是自动成了GBK系列的。但是我的本地不是的。
本地的是直接urlencode ,看的是文件的编码是UTF-8还是ANSI。
这个是否和远程主机有关系呢?远程是linux 系统 Apache 的。
我本地 WIN XP ,Apache 系统的。
环境是否是UTF-8,这个是如何看啊,在哪里设置。我也觉得是跟配置环境有关系。
1.%D6%D0%B9%FA%C8%CB%C3%F1%BD%E2%B7%C5%BE%FC 本来就是gb编码(实际应该说ansi)2.服务器有预定义字符集的,只能说你的localhost预定义gbk或者默认跟系统一样,远程那个不是,像我用的免费空间预定义是ISO-8859-1...
…… 我可能越描述越乱了。涉及主机:(1)本地主机站点LOC,(2)远程主机站点FTP
涉及文件:
(1)a.php [里面有一个连接连接到b.php的,该连接的网址中带的参数中包含中文]
(2)b.php [里面有接收来自a.php的传递过来的参数,要求输出本来的传递值]出现问题,必须如下情况才可以让b.php接收成功来自于a.php的值:
(1)本地情况 <?
// a.php内容
$str = '中国人民解放军';
echo '<a href="b.php?tag='.urlencode($str).'">'.$str.'</a>';
?><?php
//b.php 使用如下可以接收到a.php传递过来的值
$str = urldecode( trim($_GET["tag"]) );
?>(2)远程情况<?
// a.php内容
$str = '中国人民解放军';
echo '<a href="b.php?tag='.urlencode($str).'">'.$str.'</a>';
?><?php
//b.php 使用如下可以接收到a.php传递过来的值,必须转码才行
$str = urldecode( trim($_GET["tag"]) );
$str = mb_convert_encoding($str,"UTF-8","GBK");?>然后本地和远程里面a.php 里面出来的urlencode的值都是一样的。
远程是linux 系统 Apache 的。
我本地 WIN XP ,Apache 系统的。我曾經在以前碰過,兩臺服務器,一臺linux 一臺win,一樣是編碼問題 然後需要不同的處理。具體應該是跟系統的字符集什麼的有關,上面有人說了。
让你们管运维的。把这个配置去了就行。
AddDefaultCharset UTF-8