完美解决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 print EOF实现方法
May 21 PHP
UCenter 批量添加用户的php代码
Jul 17 PHP
PHP中isset()和unset()函数的用法小结
Mar 11 PHP
PHP使用in_array函数检查数组中是否存在某个值
Mar 25 PHP
PHP、Java des加密解密实例
Apr 27 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
Jun 03 PHP
php简单smarty入门程序实例
Jun 11 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
PHP编程实现脚本异步执行的方法
Aug 09 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
PHP内置函数生成随机数实例
Jan 18 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 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
PHP 多维数组排序(usort,uasort)
2010/06/30 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
手写Vue源码之数据劫持示例详解
2021/01/04 Vue.js
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
Python 中的lambda函数介绍
2018/10/10 Python
Python字符串对象实现原理详解
2019/07/01 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
自我评价的写作规则
2014/01/06 职场文书
食堂个人先进事迹
2014/01/22 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
医药销售自荐书
2014/05/29 职场文书
建筑安全责任书范本
2014/07/24 职场文书
教师节横幅标语
2014/10/08 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
刑事撤诉申请书
2015/05/18 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
导游词之昭君岛
2020/01/17 职场文书
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL