完美解决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面向对象的方法重载两种版本比较
Sep 08 PHP
又一个php 分页类实现代码
Dec 03 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
Jan 17 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 PHP
php中autoload的用法总结
Nov 08 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
Laravel第三方包报class not found的解决方法
Oct 13 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 为你的php增加功能
2012/09/06 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php实现两个数组相加的方法
2015/02/17 PHP
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
Angular路由简单学习
2016/12/26 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
2020/12/24 Javascript
python发送邮件脚本
2018/05/22 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
用Python解数独的方法示例
2019/10/24 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
python time.strptime格式化实例详解
2021/02/03 Python
加拿大女鞋品牌:ALDO
2016/11/13 全球购物
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
如何提高SQL Server的安全性
2016/07/25 面试题
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
党章学习思想汇报
2014/01/14 职场文书
产品销售计划书
2014/05/04 职场文书
民主评议党员自我评价材料
2014/09/18 职场文书
群众路线个人整改方案
2014/10/25 职场文书
五四青年节活动总结
2015/02/10 职场文书
Go语言grpc和protobuf
2022/04/13 Golang