【发布时间】:2015-05-28 05:48:30
【问题描述】:
我为 Windows bot 找到了很多关于这个的答案,对于 Linux 没有什么非常有用的,我还没有检查过。
我的服务器是CentOS6,ext4文件系统,PHP版本是5.4.39,MySQL 5.5.42。
全部设置为使用UTF8,从LANG环境变量到数据库、mysql客户端连接、php等
但是使用以下代码,我无法读取带有特殊字符的文件,例如 èàòì 等。
相同的代码在我的 Mac 上工作(从端口安装的 php 和 mysql)。
正如您在代码中看到的,有一些带注释的测试。 mb_detect_encoding($track,'auto') 返回 UTF-8。
$db->bind("id",$this->request->get(1)); $file = $db->row("从文件 f 中选择 f.name,其中 f.id = :id and f.type = 'mp3';"); $track = realpath(__DIR__ . '/../') 。 $file['name']; //$track = mb_convert_encoding(realpath(__DIR__ . '/../' . $file['name']), "UTF-8"); //$track = iconv('utf-8', 'cp1252', realpath(__DIR__ . '/../' . $file['name'])); //echo mb_detect_encoding($track,'auto'); if (file_exists($track)) { header("内容传输编码:二进制"); header("内容类型:音频/mpeg,音频/x-mpeg,音频/x-mpeg-3,音频/mpeg3"); header('内容长度:' .filesize($track)); header('缓存控制:无缓存'); 读取文件($轨道); }有什么建议吗?
更新
看起来这个问题与 php 和文件相关的函数有关,这些函数似乎没有使用 UTF-8 和文件名.. 出于某种原因。
我使用了一个简单的 php 脚本并从 shell 运行,即使直接在 php 脚本中指定文件名,我也有相同的行为(因此不涉及 db)。
PHP 设置:
$ php -i | grep UTF default_charset => UTF-8 => UTF-8 LANG => en_US.UTF-8 LC_CTYPE => en_US.UTF-8 _SERVER["LANG"] => en_US.UTF-8 _SERVER["LC_CTYPE"] => en_US.UTF-8 $ php --版本 PHP 5.4.39 (cli) (内置: Mar 19 2015 06:25:23)需要明确的是,这样的事情是行不通的:
$track = "/path/to/existsing/file/with/spechialchars"; 回声“->” .$track 。 "\n"; if (file_exists($track)) { 回声“确定” .$track 。 "\n"; }【问题讨论】:
-
"LANG 环境变量" -- ??与 MySQL 无关。 (我认为)