完美解决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下实现折线图效果的代码
Apr 28 PHP
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
使用Apache的htaccess防止图片被盗链的解决方法
Apr 27 PHP
php 获取本地IP代码
Jun 23 PHP
PHP函数strip_tags的一个bug浅析
May 22 PHP
php实现webservice实例
Nov 06 PHP
PHP多线程之内部多线程实例分析
Mar 09 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
Dec 25 PHP
一段实用的php验证码函数
May 19 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
Oct 21 PHP
php实现微信发红包功能
Jul 13 PHP
PHP的简单跳转提示的实现详解
Mar 14 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
Windows下PHP的任意文件执行漏洞
2006/10/09 PHP
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
javascript两种function的定义介绍及区别说明
2013/05/02 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
javascript匀速运动实现方法分析
2016/01/08 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
centos下更新Python版本的步骤
2013/02/12 Python
python计算N天之后日期的方法
2015/03/31 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
应届生求职信范文
2014/06/30 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
Pandas加速代码之避免使用for循环
2021/05/30 Python
教你一步步实现一个简易promise
2021/11/02 Javascript
Elasticsearch 配置详解
2022/04/19 Java/Android