无法找到名称中包含utf-8字符的.ctp文件

时间:2013-12-16 20:46:48

标签: apache .htaccess cakephp cakephp-2.3

我正在使用CakePHP 2.3。

在路线文件中,我包含了这样的内容:

Router::connect('/thomas-lammle', array('controller' => 'pages', 'action' => 'display', 'thomas-lämmle'));

我希望它显示的.ctp文件被命名为此名称,包括a上的点,以便自动生成的页面标题将正确显示。在我尝试过的一台服务器上,它工作正常,但在另一台服务器上,它会抛出以下错误:

Missing View
Error: The view for PagesController::display() was not found.
Error: Confirm you have created the file: /www/test_site/public_html/app/View/Pages/thomas-lämmle.ctp
Notice: If you want to customize this error message, create app/View/Errors/missing_view.ctp

当然,两个服务器上都存在名为thomas-lämmle.ctp的文件,这很奇怪,因为当名称看起来与肯定存在的文件匹配时,我无法分辨为什么它甚至报告文件丢失。可能是我的apache设置的东西?如果是这样,可以通过某种方式更改.htaccess文件来解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

根据我的经验,大多数高级语言的文件相关API委托给底层C实现,后者又使用LANG变量将文本文件名转换为二进制流。默认情况下, system 程序以LANG=C启动,这意味着字符(您在文件管理器或控制台中看到的字符)被编码为ASCII,而用户程序使用utf8的一些变体,比如LANG=en_US.UTF-8 - 至少这是我在大多数Ubuntu安装中找到的,但是什么是用户以及什么是 system 显然是实施细节。

如果要将Unicode文本用于文件名,则必须确保

  1. apache进程以 right LANG启动(您可以使用getenv检查来自PHP的环境变量,并使用文件系统进行快速实验)。 right LANG是您在首次创建文件时使用的编码
  2. 将正确的字符传递给CakePHP路由器(从您的报告中可以看出这种情况,但仍然如此)。