完美解决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 相关文章推荐
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
php获取某个目录大小的代码
Sep 10 PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
php实现简单洗牌算法
Jun 18 PHP
php读取图片内容并输出到浏览器的实现代码
Aug 08 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
Aug 20 PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
Nov 14 PHP
yii框架无限极分类的实现方法
Apr 08 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
Jun 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
中国的第一台收音机
2021/03/01 无线电
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
2017/03/30 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
解读ES6中class关键字
2017/11/20 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
仅利用30行Python代码来展示X算法
2015/04/01 Python
如何在Python中编写并发程序
2016/02/27 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
python面试题小结附答案实例代码
2019/04/11 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
python drf各类组件的用法和作用
2021/01/12 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
大学生毕业自我评价范文分享
2013/11/07 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS