centos系统上php处理中文文件名

本文详细记录了在CentOS系统中使用PHP处理中文文件名时遇到的问题及解决过程,包括调整数据库连接编码及系统文件名编码转换。

在centos系统上用php处理中文文件名

环境介绍: apache: utf8, mysql: utf8, php页面 utf8; centos lang: en_utf8

任务的简单描述,通过类似

http://www.shumo.com/file.php?id=2 的uri来获取编号为id的文件流,file.php通过访问数据库表来获取中文文件名 ,然后通过fpassthru向客户端输出文件数据。

问题:数据中获取的文件名,file_exists 判定不存在,但是文件明明是存在的。

莫名其妙,于是在本机上写测试代码,发现也有问题。

解决步骤:

1、检查系统文件名的编码, 通过编写测试代码

$dir = dirname(__FILE__) . "/zh_files/";
$handle = @opendir($dir) or die("Cannot open " . $dir);
while ($file = readdir($handle)) {
	if ($file != '.' && $file != '..') {
		echo "$file <br />";
	}
}
closedir($handle);

 通过浏览器选择编码,使中文文件名可以正常显示,以此确定系统的中文编码。

通过这一步骤,本机(windows)上,把从数据库中取得的中文名转换编码,任务就OK了

$filename = mb_convert_encoding($filename, "GBK", "UTF-8");

 但是在centos上还是不行。

 

2、检查从数据库中取出的数据编码,虽然数据库是默认utf8的,但是取出的数据却不一定是utf8的。后来查找发现有一个命令,显式指定数据库的链接方式

SET NAMES UTF8;

 即在建立连接后,运行该命令

@ $db = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
if (mysqli_connect_errno()) {
	die('connect error');
}
$db->query("set names utf8");

 考,问题解决了。

 

另:

因为有几百个小文件需要上传到centos上,提供下载,随即用winrar打了包,上传到ftp上,居然解压不了yum install unrar不行, 下了一个rar linux版本的,make后发现GLIBC2.7 not found; 这个不知道怎么解决;

所以还是下载了一个7-zip, 先压缩选择tar, 再压缩选择gzip, 打包成 name.tar.gz. 再上传通过tar解压。

 

真是郁闷,这些事情搞了半个晚上!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值