完美解决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 相关文章推荐
PHP5中Cookie与 Session使用详解
Apr 30 PHP
IIS6.0中配置php服务全过程解析
Aug 07 PHP
php将字符串转换成16进制的方法
Mar 17 PHP
php实现批量修改文件名称的方法
Jul 23 PHP
Laravel搭建后台登录系统步骤详解
Jul 26 PHP
php微信开发之自定义菜单完整流程
Oct 08 PHP
详解PHP序列化和反序列化原理
Jan 15 PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 PHP
Yii框架操作cookie与session的方法实例详解
Sep 04 PHP
laravel接管Dingo-api和默认的错误处理方式
Oct 25 PHP
PHP isset empty函数相关面试题及解析
Dec 11 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 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读取csv文件内容的详解
2013/06/18 PHP
PHP无限分类(树形类)
2013/09/28 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
JS查看对象功能代码
2008/04/25 Javascript
prototype 学习笔记整理
2009/07/17 Javascript
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
python 除法保留两位小数点的方法
2018/07/16 Python
用pycharm开发django项目示例代码
2018/10/24 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
python实现QQ批量登录功能
2019/06/19 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
详解Django CAS 解决方案
2019/10/30 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
加拿大品牌鞋包连锁店:Little Burgundy
2021/02/28 全球购物
民族团结先进个人材料
2014/02/05 职场文书
给老师的检讨书
2014/02/11 职场文书
诚信考试倡议书
2014/04/15 职场文书
中学教师教学工作总结
2015/08/13 职场文书
各国货币符号大全
2022/02/17 杂记
Golang gRPC HTTP协议转换示例
2022/06/16 Golang
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript