完美解决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版本号
Oct 09 PHP
mysql下创建字段并设置主键的php代码
May 16 PHP
php去掉字符串的最后一个字符附substr()的用法
Mar 23 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
Apr 17 PHP
PHP程序员不应该忽略的3点
Oct 09 PHP
CI框架常用方法小结
May 17 PHP
mysql desc(DESCRIBE)命令实例讲解
Sep 24 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
关于PHP转换超过2038年日期出错的问题解决
Jun 28 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
PHP连续签到功能实现方法详解
Dec 04 PHP
php中使用array_filter()函数过滤数组实例讲解
Mar 03 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和ACCESS写聊天室(九)
2006/10/09 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
前端Electron新手入门教程详解
2019/06/21 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
Vue将props值实时传递 并可修改的操作
2020/08/09 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
vue-cli3配置favicon.ico和title的流程
2020/10/27 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
python实现转圈打印矩阵
2019/03/02 Python
详解Python3 pandas.merge用法
2019/09/05 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
蒂娜商店:Tiina the Store
2019/12/07 全球购物
劳动工资科岗位职责范本
2014/03/02 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书