PHP文件名(或完整路径中的目录)是否可以包含UTF-8字符?

PHP文件名(或完整路径中的目录)是否可以包含UTF-8字符?,php,apache,unicode,utf-8,url-rewriting,Php,Apache,Unicode,Utf 8,Url Rewriting,我想访问一个名称中包含UTF-8字符的PHP文件 文件中没有BOM表。它只包含一个显示几个unicode字符的echo语句 从浏览器(FireFox 3.0.8,IE7)访问PHP页面会导致HTTP错误500 Apache日志中有两个条目(文件为/க.字母க 是一个复合字符,对应于以下日志中的字符\xe0\xae\x95): [Sat Apr 04 09:30:25 2009][error][client 127.0.0.1]PHP警告:未知:无法打开流:第0行未知中没有此类文件或目录 [Sat

我想访问一个名称中包含UTF-8字符的PHP文件

文件中没有BOM表。它只包含一个显示几个unicode字符的echo语句

从浏览器(FireFox 3.0.8,IE7)访问PHP页面会导致HTTP错误500

Apache日志中有两个条目(文件为/க.字母க 是一个复合字符,对应于以下日志中的字符\xe0\xae\x95):

[Sat Apr 04 09:30:25 2009][error][client 127.0.0.1]PHP警告:未知:无法打开流:第0行未知中没有此类文件或目录

[Sat Apr 04 09:30:25 2009][error][client 127.0.0.1]PHP致命错误:未知:无法打开所需的'D:/va/ROOT/\xe0\xae\x95.PHP'(include_path=';C:\php5\pear'),位于第0行的未知位置

当文件名和目录名为英文时,相同的页面也可以工作。在相同的设置中,对这些页面使用SSI没有问题

编辑

删除了关于url重写的信息,因为它似乎不是一个因素


删除mod_rewrite后,PHP文件仍然无法工作。如果将文件重命名为非UTF名称,则此选项有效。但是,shtml甚至可以在文件和/或路径名中使用UTF字符。

仅仅因为字符集是UTF-8并不意味着它支持所有更高的Unicode字符

Unicode支持是PHP6中的一个主要补充,PHP5由于缺少Unicode支持而显得很疯狂

如果您的PHP脚本正在生成链接,这可能与apache直接解释url并将其重定向不同。

  • 我知道PHP本身可以使用Unicode URL,因为我曾尝试在MediaWiki(基于PHP,也运行WikiPedia)中使用Unicode页面名称,而且确实有效。例如,URL,如/index.php/Page_name©等。所以PHP可以处理它。但是Apache查找源文件具有UTF-8名称的文件时可能会出现问题

  • 字符编码的PHP.ini设置不应影响这一点;web服务器的工作是查找特定的资源,然后在确定它是PHP文件后调用PHP。这意味着web服务器和底层文件系统本身必须能够处理UTF-8文件名

  • 它在没有mod_重写规则的情况下工作吗?Ie,如果在RewriteEngine关闭的情况下禁用重写引擎,然后请求va.in/utf_dir/utf_file.php?如果是这样,那么可能是mod_rewrite配置问题或规则问题

  • 当您仅在中键入地址时,某些浏览器可能不正确支持URL中的Unicode,例如较旧的浏览器。较旧的浏览器可能会跳过UTF-8编码步骤。但是,如果您正在跟踪页面上的链接,而该页面是UTF-8编码的,则这不应阻止它工作


    • 我遇到了同样的问题,做了一些研究,得出了以下结论。这是针对Windows上的php5;在其他平台上可能是这样,但我还没有检查

    • 所有php文件系统函数(dir、is_dir、is_file、file、filemtime、filesize、file_exists等)仅接受和返回ISO-8859-1中的文件名,而不考虑程序或ini文件中的默认_字符集

    • 如果文件名包含unicode字符,则dir->read将其作为相应的ISO-8859-1字符返回(如果有),否则将替换为问号

    • 引用文件时,例如在is_文件或文件中,如果传入UTF-8文件名,则当文件名包含任何两个字节或更多字符时,将找不到该文件。但是,如果UTF-8字符可以在ISO-8859-1中表示,则is_文件(utf8_decode($filename))等可以工作

    • 换句话说,PHP5根本无法寻址名称中包含多字节字符的文件

      如果请求具有多字节字符的UTF-8 URL,并且该URL直接对应于文件,PHP将无法打开该文件,因为它无法对其进行寻址

      如果您只是想在您的语言中使用漂亮的URL,那么使用mod_重写的建议似乎是个不错的选择


      但是,如果您正在存储和检索用户上传和下载的文件,则必须解决此问题。一种方法是在服务器上使用任意(非UTF-8)文件名,例如递增的数字,并在数据库或XML文件或类似文件中为文件编制索引。另一种方法是将文件作为BLOB存储在数据库中。另一种方法(可能更容易看到发生了什么,如果索引损坏,也不会出现问题)是自己对文件名进行编码——一种好的技术是在服务器磁盘上存储时对所有传入的文件名进行URL编码(sic),并在为下载设置mime头中的文件名之前对其进行URL解码。所有不太常见的字符(除了%)都会被编码为%nn,因此文件名中的空格、跨平台支持和模式匹配方面的任何问题都在很大程度上得以避免。

      否。PHP文件名必须是ASCII格式,无论您如何设置服务器,PHP5都无法处理,因此我们等待PHP6。在PHP脚本中,您可以使用utf8\U解码处理utf-8文件名/url。您可以使用.htaccess和SQL来解决许多问题,但无法运行unicode文件名

      David Earl的答案是正确的。

      使用“wfio://”进行拷贝写入,即e.t.c

      对于文件夹:

      .htaccess:

      php\u value auto\u prepend\u文件C:/fix.php

      fix.php:

      $file = $_SERVER['SCRIPT_FILENAME'];
      if (!is_readable($file)) {
          $file="wfio://".$file;
                      include $file;
                      exit;
              }
      

      但是更好的php使用Linux操作系统

      您可以让php通过扫描目录并使用它找到的名称来打开文件,即使它采用不同的编码。->我会在这里查的