2013-12-16 54 views
1

我正在使用CakePHP 2.3。。用utf-8字符命名的.ctp文件無法找到

在routes文件,我已經包含了這樣的事情:

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

我想.ctp文件,它的顯示被命名爲這個名字,包括點過一個,從而使自動生成的頁面標題將正確顯示。在一臺服務器我已經試過了,它工作正常,但在另一方面,它引發以下錯誤:

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 

當然兩臺服務器上存在一個名爲托馬斯 - lämmle.ctp的文件,這是奇怪,因爲我不能告訴爲什麼它甚至報告文件丟失,當名稱看起來與絕對存在的文件相匹配時。它可以是我的Apache設置的東西?如果是這樣,可以通過以某種方式更改.htaccess文件來解決這個問題嗎?

+1

我個人試圖阻止這種文件名,因爲有些服務器不能很好地處理它們。在你的情況下,最簡單的解決方法當然是重命名文件(作爲獎勵,它也可以匹配請求的URL在你的路線:)) – thaJeztah

+0

@thaJeztah是的,這就是我最終做的,因爲我沒有直接控制問題服務器。 – Kai

+0

有時候這只是最好的方法,儘管它應該*可以用UTF8文件名。可能是CakePHP中的錯誤或服務器或PHP的配置中的錯誤,PHP中的代碼頁轉換可能會在* ss中進行調試。 – thaJeztah

回答

2

根據我的經驗,大多數高級語言的與文件相關的API委託給底層C實現,後者又使用LANG變量將文本文件名轉換爲二進制流。默認系統程序以LANG=C開頭,這意味着字符(在文件管理器或控制檯中看到的字符)被編碼爲ASCII,而用戶程序使用某些變種的utf8,如LANG=en_US.UTF-8 - 至少這是我在大多數Ubuntu安裝中發現了什麼,但什麼是用戶什麼是系統顯然是一個實現細節。

如果你想文件名使用Unicode文本,你必須確保

  1. apache進程開始與LANG(你可以檢查從PHP的環境變量與getenv,並做出快速的實驗與文件系統)。 right LANG是您在首次創建文件時使用的編碼
  2. 將正確的字符傳遞給CakePHP路由器(這似乎是您的報告中的情況,但仍然存在)。
相關問題