【问题标题】:PHP and Linux filesystem names in utf-8utf-8 中的 PHP 和 Linux 文件系统名称
【发布时间】: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 无关。 (我认为)

标签: php mysql linux utf-8


【解决方案1】:

要记住的重要一点是,在 Linux 中,文件名没有字符编码,而只是一个 8 位字符串。

例如,如果您通过 FTP 上传文件并且 FTP 服务器使用 Windows-1252 字符编码,则文件名将是 8 位 Windows-1252。无论语言环境或 LANG 是什么,尝试使用 UTF-8 字符打开文件都会失败。

这与文件名始终为 UTF-8 的 OS X 和文件名始终为 UTF-16 的 Windows 不同。

您可能会发现 PHP 中的字符串也只是 8 位字符串,因此无法确定字符串使用的是什么编码 - 您可以轻松地将两个字符串编码为不同的字符集。

我的建议是确保您知道读取或输出的任何字符串的编码,包括表单字段和文件名。

因此,请确保磁盘上的文件名是 UTF-8,并且您放入数据库的文件名值是 UTF-8。然后,当您从数据库中提取值时,文件变量应该已经是 UTF-8 编码,并且准备好传递给fopen 命令。

【讨论】:

  • 感谢您的回答,此时我认为涉及到 FTP,因为文件是通过 FTP 上传的。经过进一步的测试,我设法正确读取了文件名,但在某些情况下它仍然失败。我想知道是否有办法转换 filname 字符集。
  • 试试convmv。它是 Ubuntu 中的可安装包。
猜你喜欢
  • 2011-11-13
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 2021-07-12
  • 2013-12-05
  • 2012-02-04
相关资源
最近更新 更多