PHP中文乱码 完美解决PHP中文乱码问题

PHP中文出现乱码是很常见的问题,其实最主要的问题是编码的不统一
一.首先是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是保存在服务上文件的地址。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者翱云科技,代码PbootCMS_v1.1.4,PbootCMS是翱云科技开发的全新内核的开源企业建站系统, 系统以高效、简洁、强悍为开发目标,能够满足各类企业网站建设的需要。 系统采用高效、简洁的模板标签,只要懂HTML就可快速开发企业网站。 系统采用PHP语言开发,使用自主研发的高速MVVM多层开发框架及多级缓存技术。 系统默认采用Sqlite轻型数据库,放入PHP空间即可直接使用,可选Mysql、Pgsql等数据库,满足各类存储需求。系统采用响应式管理后台,满足各类设备随时管理的需要。 功能简介: 1、支持自定义模板 2、支持站点信息后台配置 3、支持无限极栏目 4、支持自定义内容模型 5、支持自定义内容字段 6、支持专题单页内容 7、支持列表内容管理 8、支持内容复制移动 9、支持自定义栏目地址 10、支持自定义内容地址 11、支持多语言区域建站 12、支持手机独立模板 13、支持手机版域名绑定 14、支持首页分页 15、支持页面SEO优化 16、支持在线留言 17、支持幻N组灯片轮播 18、支持友情链接 19、支持自定义表单 20、支持多条件筛选 21、支持多条件搜索 22、支持验证码开关 23、支持留言发送到多邮箱 24、支持API对接 25、支持小程序/APP开发 26、支持Ajax远程获取数据 27、支持自定义标签 28、支持全站伪静态 29、支持前端动态缓存 30、支持系统角色管理 31、支持完整角色权限管理 32、支持多用户在线管理 33、支持系统日志功能 34、支持数据库在线管理 系统安装: 发布的源码默认采用Sqlite数据库,放入PHP(大于等于5.3)空间即可直接使用。 如果需要启用Mysql版本,请导入目录下数据库文件\static\backup\sql\xxx.sql,同时请注意使用最新日期名字的脚本文件,并修改config/database数据库连接文件信息。 注意:如果导入的数据库名字不一致,请先修改sql文件中数据库名为自己的。 系统后台默认访问路径:http://ip/admin.php 账号:admin 密码:123456, 最近更新记录: PbootCMS V1.1.4 build 2018-06-25 1、修复自定义表单表名重复仍然添加成功问题; 2、修复分享到微信导致页面错误的问题; 3、修复静态缓存失效问题并提高缓存效果; 4、新增多条件筛选时多选类型支持; 5、新增全站多条件筛选的支持; 6、新增登陆时数据库目录写入权限判断提示; 7、新增后台开启高速静态缓存功能; 8、新增后台填写授权码功能; 9、新增指定列表scode使用逗号调用多个分类功能; 10、新增{pboot:keyword}标签; 11、新增数据库安全提示及修改功能; PbootCMS V1.1.3 build 2018-06-15 1、优化Sqlite查询过程高并发锁死问题; 2、优化编辑器配置; 3、优化标签参数获取方法; 4、修复部分环境截取描述文本出现问题; 5、修复API搜索数据获取方式错误; 6、新增API获取指定分类子类接口; 7、新增多条件筛选功能; 8、新增无缩略图时自动调用默认图功能; 9、新增上下篇标签参数notext定义"没有了"文本; 10、新增内容管理复制和移动功能;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值