完美解决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 相关文章推荐
教你IIS6的PHP最佳配置方法
Sep 05 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
Oct 25 PHP
PHP中strtotime函数使用方法分享
Jan 10 PHP
php读取图片内容并输出到浏览器的实现代码
Aug 08 PHP
PHP批量上传图片的具体实现方法介绍.
Feb 26 PHP
php邮件发送的两种方式
Apr 28 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
Apr 30 PHP
Joomla使用Apache重写模式的方法
May 04 PHP
php5.3后静态绑定用法详解
Nov 11 PHP
php封装的验证码类分享
Feb 26 PHP
thinkphp5+layui实现的分页样式示例
Oct 08 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
javascript读取xml实现javascript分页
2013/12/13 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
jquery实现垂直无限轮播的方法分析
2019/07/16 jQuery
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
python自动12306抢票软件实现代码
2018/02/24 Python
Python logging模块用法示例
2018/08/28 Python
Python subprocess库的使用详解
2018/10/26 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
python 装饰器的使用示例
2020/10/10 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
竞聘副主任科员演讲稿
2014/01/11 职场文书
学习十八大报告感言
2014/02/04 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
护士自我推荐信范文
2015/03/24 职场文书
任命通知范文
2015/04/21 职场文书
投诉信回复范文
2015/07/03 职场文书
python读取mat文件生成h5文件的实现
2022/07/15 Python
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技