完美解决PHP中文乱码


Posted in PHP onNovember 26, 2009

一.首先是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是保存在服务上文件的地址。
PHP 相关文章推荐
PHP 开源AJAX框架14种
Aug 24 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
PHP中的日期加减方法示例
Aug 21 PHP
Yii框架中memcache用法实例
Dec 03 PHP
php验证邮箱和ip地址最简单方法汇总
Oct 30 PHP
php连接mysql数据库
Mar 21 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 PHP
Yii2.0 RESTful API 基础配置教程详解
Dec 26 PHP
Yii框架的redis命令使用方法简单示例
Oct 15 PHP
浅析PHP echo 和 print 语句
Jun 30 PHP
php google或baidu分页代码
Nov 26 #PHP
php 接口类与抽象类的实际作用
Nov 26 #PHP
在mysql数据库原有字段后增加新内容
Nov 26 #PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 #PHP
php 运行效率总结(提示程序速度)
Nov 26 #PHP
Ajax+PHP 边学边练 之二 实例
Nov 24 #PHP
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 #PHP
You might like
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
ajax实现无刷新分页(php)
2010/07/18 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
html超链接打开窗口大小的方法
2013/03/05 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
jquery实现漂亮的二级下拉菜单代码
2015/08/26 Javascript
JS打印组合功能
2016/08/04 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
pyside写ui界面入门示例
2014/01/22 Python
用Python实现QQ游戏大家来找茬辅助工具
2014/09/14 Python
django 自定义用户user模型的三种方法
2014/11/18 Python
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
Python获取当前路径实现代码
2017/05/08 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
pandas 像SQL一样使用WHERE IN查询条件说明
2020/06/05 Python
英国航空官网:British Airways
2016/09/11 全球购物
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
c++工程师面试问题
2013/08/04 面试题
八年级数学教学反思
2014/01/31 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
委托证明模板
2014/09/16 职场文书
地心历险记观后感
2015/06/15 职场文书
酒店员工管理制度
2015/08/05 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL