phpurl中文乱码
1. php乱码怎么办
PHP中文乱码一般是字符集问题,编码主要有下面几个问题。
一.首先是PHP网页的编码
1.php文件本身的编码与网页的编码应匹配
a.如果欲使用gb2312编码,那么php要输出头:header(“Content-Type: text/html; charset=gb2312"),静态页面添加<meta http-equiv="Content-Type" content="text/html; charset=gb2312">,所有文件的编码格式为ANSI,可用记事本打开,另存为选择编码为ANSI,覆盖源文件。
b.如果欲使用utf-8编码,那么php要输出头:header(“Content-Type: text/html; charset=utf-8"),静态页面添加<meta http-equiv="Content-Type" content="text/html; charset=utf-8">,所有文件的编码格式为utf-8。保存为utf-8可能会有点麻烦,一般utf-8文件开头会有BOM,如果使用session就会出问题,可用editplus来保存,在editplus中,工具->参数选择->文件->UTF-8签名,选择总是删除,再保存就可以去掉BOM信息了。
2.php本身不是Unicode的,所有substr之类的函数得改成mb_substr(需要装mbstring扩展);或者用iconv转码。
二.PHP与Mysql的数据交互
PHP与数据库的编码应一致
1.修改mysql配置文件my.ini或my.cnf,mysql最好用utf8编码
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-storage-engine=MyISAM
在[mysqld]下加入:
default-collation=utf8_bin
init_connect='SET NAMES utf8'
2.在需要做数据库操作的php程序前加mysql_query("set names '编码'");,编码和php编码一致,如果php编码是gb2312那mysql编码就是gb2312,如果是utf-8那mysql编码就是utf8,这样插入或检索数据时就不会出现乱码了
三.PHP与操作系统相关
Windows和Linux的编码是不一样的,在Windows环境下,调用PHP的函数时参数如果是utf-8编码会出现错误,比如move_uploaded_file()、filesize()、readfile()等,这些函数在处理上传、下载时经常会用到,调用时可能会出现下面的错误:
Warning: move_uploaded_file()[function.move-uploaded-file]:failed to open stream: Invalid argument in ...
Warning: move_uploaded_file()[function.move-uploaded-file]:Unable to move '' to '' in ...
Warning: filesize() [function.filesize]: stat failed for ... in ...
Warning: readfile() [function.readfile]: failed to open stream: Invalid argument in ..
在Linux环境下用gb2312编码虽然不会出现这些错误,但保存后的文件名出现乱码导致无法读取文件,这时可先将参数转换成操作系统识别的编码,编码转换可用mb_convert_encoding(字符串,新编码,原编码)或iconv(原编码,新编码,字符串),这样处理后保存的文件名就不会出现乱码,也可以正常读取文件,实现中文名称文件的上传、下载。
其实还有更好的解决方法,彻底与系统脱离,也就不用考虑系统是何编码。可以生成一个只有字母和数字的序列作为文件名,而将原来带有中文的名字保存在数据库中,这样调用move_uploaded_file()就不会出现问题,下载的时候只需将文件名改为原来带有中文的名字。实现下载的代码如下
header("Pragma: public");
header("Expires: 0");
header("Cache-Component: must-revalidate, post-check=0, pre-check=0");
header("Content-type: $file_type");
header("Content-Length: $file_size");
header("Content-Disposition: attachment; filename=\"$file_name\"");
header("Content-Transfer-Encoding: binary");
readfile($file_path);
$file_type是文件的类型,$file_name是原来的名字,$file_path是保存在服务上文件的地址。
2. php 有关utf-8乱码的问题
服务器上用了别的编码,应该是windows的服务器吧?有可能是GBK或者GB2312编码。
两种方法解决此问题。
1、先在本地把所有文件都换成服务器的编码,然后再传上去;此法,你的php编码需要与服务器上的数据库编码一致,也既有可能是那两种编码。
2、修改服务器上的编码为utf-8。此方法需要你有足够的权限去修改服务器上apache或者IIS编码。如果修改编码成功,你的数据库也不用换编码。
如果保持你的网页编码不变,那就要修改mysql编码,即像stjdydayou
所言,执行数据库数据插入、更改、查询时,执行一条查询语句:
mysql_query("set
names
'utf-8'");
之所有用utf-8编码,是因为你的php编码目前为utf-8.
3. 中文url编码、base64编码,PHP解码中文部分乱码
如果两端服务器页面使用的编码不一致,就会导致乱码
如你所说,对方服务器发来的是GBK编码的内容,如果你本地PHP用的编码不是GBK就会是乱码
2种解决方案:
将页面编码更改为GBK(可以通过header('Content-Type:text/html charset=gbk');)
将GBK编码转为当期页面编码(假设当前页面是utf-8),可以使用iconv('gbk','utf-8',$content);其中$content是你经过urldecode、base64解码后的字符串
4. php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
中间遇到一个问题是提交的中文文件名直接放到header里在IE下会变成乱码,解决方法是将文件名先urlencode一下再放入header,如下。
复制代码
代码如下:
<?php
$file_name
=
urlencode($_REQUEST['filename']);
header("Pragma:
public");
header("Expires:
0");
header("Cache-Control:
must-revalidate,
post-check=0,
pre-check=0");
header("Content-Type:
application/force-download");
header('Content-Type:
application/vnd.ms-excel;
charset=utf-8');
header("Content-Transfer-Encoding:
binary");
header('Content-Disposition:
attachment;
filename='.$file_name);
echo
stripslashes($_REQUEST['content']);
?>
解决PHP
Header下载文件在IE文件名中文乱码有两种常见的,一种是是把页面编码改成utf8,另一种是对中文url进入urlencode编码就可以解决了。
解决方案一(我的页面是utf-8编码):
复制代码
代码如下:
$filename
=
"中文.txt";
$ua
=
$_SERVER["HTTP_USER_AGENT"];
$encoded_filename
=
urlencode($filename);
$encoded_filename
=
str_replace("+",
"%20",
$encoded_filename);
header('Content-Type:
application/octet-stream');
if
(preg_match("/MSIE/",
$ua))
{
header('Content-Disposition:
attachment;
filename="'
.
$encoded_filename
.
'"');
}
else
if
(preg_match("/Firefox/",
$ua))
{
header('Content-Disposition:
attachment;
filename*="utf8'''
.
$filename
.
'"');
}
else
{
header('Content-Disposition:
attachment;
filename="'
.
$filename
.
'"');
}
解决方法二
将文件名先urlencode一下再放入header,如下。
代码如下:
复制代码
代码如下:
<?php
$file_name
=
urlencode($_REQUEST['filename']);
header("Pragma:
public");
header("Expires:
0");
header("Cache-Control:
must-revalidate,
post-check=0,
pre-check=0");
header("Content-Type:
application/force-download");
header('Content-Type:
application/vnd.ms-excel;
charset=utf-8');
header("Content-Transfer-Encoding:
binary");
header('Content-Disposition:
attachment;
filename='.$file_name);
echo
stripslashes($_REQUEST['content']);
?>
5. php+mysql鏁版嵁搴扑腑鏂囱繛鎺ヤ贡镰侊纻set names utf8 涔熶笉琛岋紒
MySQL浼氩嚭鐜颁腑鏂囦贡镰佺殑铡熷洜涓嶅栦箮涓嫔垪鍑犵偣锛
1.server链韬璁惧畾闂棰桡纴瀹夎呮椂浣跨敤镄勫瓧绗﹂泦鏄痩atin1
2.table镄勮绯昏惧畾闂棰(鍖呭惈character涓巆ollation)
3.瀹㈡埛绔绋嫔纺(渚嫔俻hp)镄勮繛绾胯绯昏惧畾闂棰
姝e傛偍璁惧畾镄勪竴镙凤纴寤鸿浣跨敤UTF8锛屽彲鍏煎逛竴鍒囧瓧绗︺备互涓嬩负瑙e喅锷炴硶锛
涓銆侀伩鍏嶅垱寤烘暟鎹搴揿强琛ㄥ嚭鐜颁腑鏂囦贡镰佸拰镆ョ湅缂栫爜鏂规硶
1銆佸垱寤烘暟鎹搴撶殑镞跺欙细CREATE DATABASE `test`
CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci';
2銆佸缓琛ㄧ殑镞跺 CREATE TABLE `database_user` (
`ID` varchar(40) NOT NULL default '',
`UserID` varchar(40) NOT NULL default '',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
鍗冲缓搴揿拰寤鸿〃镞堕兘浣跨敤鐩稿悓镄勭紪镰佹牸寮忋
浣嗘槸濡傛灉浣犲凡缁忓缓浜嗗簱鍜岃〃鍙浠ラ氲繃浠ヤ笅鏂瑰纺杩涜屾煡璇銆
镓ц孲ET NAMES utf8镄勬晥鏋灭瓑钖屼簬钖屾椂璁惧畾濡备笅锛
SET character_set_client='utf8';
SET character_set_connection='utf8';
SET character_set_results='utf8';
浜屻侀伩鍏嶅煎叆鏁版嵁链変腑鏂囦贡镰佺殑闂棰
1:灏嗘暟鎹缂栫爜镙煎纺淇濆瓨涓簎tf-8
璁剧疆榛樿ょ紪镰佷负utf8锛歴et names utf8;
璁剧疆鏁版嵁搴揹b_name榛樿や负utf8:
ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
璁剧疆琛╰b_name榛樿ょ紪镰佷负utf8:
ALTER TABLE `tb_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
瀵煎叆锛歀OAD DATA LOCAL INFILE 'C:\\utf8.txt' INTO TABLE yjdb;
2:灏嗘暟鎹缂栫爜镙煎纺淇濆瓨涓篴nsi(鍗矴BK鎴朑B2312)
璁剧疆榛樿ょ紪镰佷负gbk锛歴et names gbk;
璁剧疆鏁版嵁搴揹b_name榛樿ょ紪镰佷负gbk:
ALTER DATABASE `db_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
璁剧疆琛╰b_name榛樿ょ紪镰佷负gbk:
ALTER TABLE `tb_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
瀵煎叆锛歀OAD DATA LOCAL INFILE 'C:\\gbk.txt' INTO TABLE yjdb;
娉锛1.UTF8涓嶈佸煎叆gbk锛実bk涓嶈佸煎叆UTF8;
2.dos涓嬩笉鏀鎸乁TF8镄勬樉绀;
涓夈佽В鍐崇绣椤典腑涔辩爜镄勯梾棰
灏嗙绣绔欑紪镰佽句负 utf-8,杩欐牱鍙浠ュ吋瀹逛笘鐣屼笂镓链夊瓧绗︺傚傛灉缃戠珯宸茬粡杩愪綔浜嗗ソ涔,宸叉湁寰埚氭棫鏁版嵁,涓嶈兘鍐嶆洿鏀圭亩浣扑腑鏂囩殑璁惧畾,闾d箞寤鸿灏嗛〉闱㈢殑缂栫爜璁句负 GBK, GBK涓嶨B2312镄勫尯鍒灏卞湪浜:GBK鑳芥瘆GB2312鏄剧ず镟村氱殑瀛楃,瑕佹樉绀虹亩浣撶爜镄勭箒浣揿瓧,灏卞彧鑳界敤GBK銆
1.缂栬緫/etc/my.cnf銆,鍦╗mysql]娈靛姞鍏default_character_set=utf8;
2.鍦ㄧ紪鍐机onnection URL镞讹纴锷犱笂?useUnicode=true&characterEncoding=utf-8鍙;
3.鍦ㄧ绣椤典唬镰佷腑锷犱笂涓涓"set names utf8"鎴栬"set names gbk"镄勬寚浠わ纴锻婅瘔MySQL杩炵嚎鍐呭归兘瑕佷娇鐢╱tf8鎴栬単bk銆
甯屾湜瀵逛綘链夋墍甯锷┿
6. 镐庢牱瑙e喅PHP涓鏂囦贡镰侀梾棰
涔辩爜鎸囩殑鏄璁$畻链虹郴缁熶笉鑳芥樉绀烘g‘镄勫瓧绗︼纴钥屾樉绀哄叾浠栨棤镒忎箟镄勫瓧绗︽垨绌虹槠锛屽备竴鍫咥SCII Code銆傛墍鏄剧ず鍑烘潵镄勬枃瀛楃粺绉颁负涔辩爜銆备贡镰佹槸锲犱负镓浣跨敤镄勫瓧绗︾殑婧愮爜鍦ㄦ湰鍦拌$畻链轰笂浣跨敤浜嗛敊璇镄勬樉绀哄瓧搴掳纴鎴栧湪链鍦拌$畻链虹殑瀛楀簱涓镓句笉鍒扮浉搴斾簬婧愮爜镓鎸囦唬镄勫瓧绗︽墍镊淬
阃氢织镣硅诧细
涔辩爜灏辨槸浣犳墦寮鐜嬮〉鎴栭偖绠憋纴閲岄溃镄勫瓧涓嶆槸鍏ㄤ腑鏂囩殑锛岃屾槸涓浜涗贡涓冨叓绯熻帿钖嶅叾濡欑殑镞犳剰涔夌殑瀛楃︾粍钖埚湪涓璧枫备富瑕佹槸璁$畻链虹殑瀛楀簱鍑洪敊镓镊淬
1涓鑸鍑虹幇鍦ㄧ绣椤碉纴鐢ㄧ绣椤典笂闱㈢殑镆ョ湅钬斺旂紪镰佲斺旂亩浣扑腑鏂囧嵆鍙瑙e喅銆
2 鍑虹幇涔辩爜涓鑸鏄疻indows绯荤粺瀛楀簱镄勯梾棰桡纴鍙鑳芥槸绯荤粺阌栾鎴栦笉姝e父鍏虫満阃犳垚镄勶纴涔熷彲鑳芥槸镆愪簺杞浠堕渶瑕佷娇鐢ㄦ搷浣灭郴缁熶互澶栫殑瀛楀簱阃犳垚镄勚傝В鍐冲姙娉曞缑鐪嫔叿浣撶殑闂棰桡纴涓鑸𨱍呭喌涓嬬殑Windows涔辩爜鍙浠ラ氲繃浠ヤ笅涓夌嶆柟娉曡В鍐炽
绗涓绉嶆柟娉曟槸涓嬭浇 瑙e喅Windows XP SP2涔辩爜琛ヤ竵 V1.00 (鍗庡啗杞浠跺洯)
绗浜岀嶆槸瑙e喅Windows绯荤粺阌栾阃犳垚镄勪贡镰侀梾棰桡纴閲嶅惎钖庣敤F8阌婵娲荤郴缁熻彍鍗曪纴杩涘叆瀹夊叏妯″纺銆傜瓑绯荤粺妫镆ュ畬姣曪纴纭鐩樻病链夊搷搴斿悗鍐嶉吨鏂版e父阃鍑哄苟閲嶆柊钖锷ㄨ$畻链猴纴姝e父杩涘叆Windows锛屽瓧浣扑竴鑸灏辫兘镊锷ㄦ仮澶嶃傝繖鏄锲犱负Windows鍦ㄨ繘鍏ュ畨鍏ㄦā寮忔椂浼氶吨鏂扮储寮曞瓧搴揿强鏁寸悊凿滃崟銆
绗涓夌嶈В鍐虫柟娉旷敤浜庝慨姝h蒋浠堕犳垚镄勬敞鍐岃〃涓鍏充簬瀛椾綋閮ㄥ垎璁剧疆鍑洪敊镄勯梾棰樸傝繍琛屸淩egedit钬濆惎锷ㄦ敞鍐岃〃缂栬緫鍣ㄣ傚湪钬淗KEY_LOCAL_MACHINE\System\CurrentControlSet\Control\fontassoc钬濋敭涓嬫湁 钬淎ssociated CharSet钬濆拰钬淎ssociated DefaultFonts钬 涓や釜阌銆傚綋鍑虹幇姹夊瓧涔辩爜镞讹纴杩欎袱涓阌涓镄勫唴瀹瑰氨鍙鑳戒笉姝g‘鐢氲呖涓嶅畬鏁淬傚畠浠镄勬g‘鍐呭瑰簲璇ユ槸钬淎ssociated CharSet钬濆唴链夆滐纸榛樿わ级銆丄NSI锛00锛夈丢B2312锛86锛夈丱EM锛团F锛夈丼YMBOL锛02锛夆濆嚑椤逛覆鍊硷纴阌鍊煎垎鍒涓衡滐纸链璁剧疆阌鍊硷级銆乊es銆乊es銆乊es銆丯o钬濓纴钥屸淎ssociated DefaultFonts钬濆唴链夆滐纸榛樿わ级銆丄ssocSystemFont銆丗ontPackegeDecorative銆丗ontPackegeDontCare銆丗ontPackegeModern銆丗ontPackegeRoman銆丗ontPackegeScript銆丗ontPackegeSwiss钬濆嚑椤逛覆鍊硷纴阌鍊煎垎鍒涓衡滐纸链璁剧疆阌鍊硷级銆乻imsun.ttf銆佸画浣撱佸画浣撱佸画浣撱佸画浣撱佸画浣撱佸画浣撯濄傞吨鏂板惎锷ㄧ郴缁熷悗姹夊瓧灏卞簲璇ユ樉绀烘g‘浜嗐傚缓璁鎭ㄥ湪淇鏀瑰墠鍏埚囦唤娉ㄥ唽琛锛屼互阒蹭慨鏀归敊璇浣跨郴缁熷嚭鐜伴梾棰樸