完美解决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 相关文章推荐
PHPShop存在多个安全漏洞
Oct 09 PHP
将文件夹压缩成zip文件的php代码
Dec 14 PHP
php去掉字符串的最后一个字符附substr()的用法
Mar 23 PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
Jun 17 PHP
php函数指定默认值方法的小例子
Dec 04 PHP
php数组添加与删除单元的常用函数实例分析
Feb 16 PHP
php数组键值用法实例分析
Feb 27 PHP
PHP 使用memcached简单示例分享
Mar 05 PHP
PHP贪婪算法解决0-1背包问题实例分析
Mar 23 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
PHP convert_cyr_string()函数讲解
Feb 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
删除数组元素实用的PHP数组函数
2008/08/18 PHP
php cookie使用方法学习笔记分享
2013/11/07 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
Python的Flask框架的简介和安装方法
2015/11/13 Python
python中星号变量的几种特殊用法
2016/09/07 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
python 模块导入问题汇总
2021/02/01 Python
Python 里最强的地图绘制神器
2021/03/01 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
合作意向书
2014/07/30 职场文书
西双版纳导游词
2015/02/03 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
走进毛泽东观后感
2015/06/04 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis