簡體   English   中英

PHP 文件名(或其完整路徑中的目錄)可以包含 UTF-8 字符嗎?

[英]Can a PHP file name (or a dir in its full path) have UTF-8 characters?

我想訪問一個名稱包含 UTF-8 字符的 PHP 文件。

該文件中沒有 BOM。 它只包含一個顯示幾個 unicode 字符的 echo 語句。

從瀏覽器(FireFox 3.0.8、IE7)訪問 PHP 頁面會導致 HTTP 錯誤 500。

Apache 日志中有兩個條目(文件為 /க.php;字母 க 是復合條目,對應於下面日志中的字符 \xe0\xae\x95):

[2009 年 4 月 4 日星期六 09:30:25] [錯誤] [客戶端 127.0.0.1] PHP 警告:未知:無法打開 stream:第 0 行的未知中沒有此類文件或目錄

[2009 年 4 月 4 日星期六 09:30:25] [錯誤] [客戶端 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 字符。

我遇到了同樣的問題並做了一些研究並得出以下結論。 這是針對 Windows 上的 php5 的; 在其他平台上可能是這樣,但我沒有檢查過。

  1. 所有 php 文件系統函數(dir、is_dir、is_file、file、filemtime、filesize、file_exists 等)僅接受和返回 ISO-8859-1 中的文件名,而與程序或 ini 文件中設置的 default_charset 無關。

  2. 如果文件名包含 unicode 字符 dir->read 會將其作為相應的 ISO-8859-1 字符返回(如果有),否則將替換為問號。

  3. 在引用文件時,例如在 is_file 或文件中,如果您傳入 UTF-8 文件名,則當該文件名包含任何兩個字節或更多字符時,將找不到該文件。 但是,如果 UTF-8 字符可以在 ISO-8859-1 中表示,則 is_file(utf8_decode($filename)) 等將起作用。

換句話說,PHP5 根本無法處理名稱中包含多字節字符的文件。

如果請求了帶有多字節字符的 UTF-8 URL 並且這直接對應於文件,則 PHP 將無法打開該文件,因為它無法解決它。

如果您只是想要您的語言中漂亮的 URL,那么使用 mod_rewrite 的建議似乎是一個不錯的選擇。

但是,如果您正在存儲和檢索用戶上傳和下載的文件,則必須解決此問題。 一種方法是在服務器上使用任意(非 UTF-8)文件名,例如遞增的數字,並索引數據庫或 XML 文件或類似文件中的文件。 另一種方法是將文件作為 BLOB 存儲在數據庫本身中。 另一種方法(這可能更容易查看發生了什么,並且如果您的索引損壞也不會出現問題)是自己編碼文件名 - 一個好的技術是在存儲在服務器上時對所有傳入的文件名進行 urlencode(原文如此) disk 和 urldecode 它們,然后在 mime header 中設置文件名以供下載。 然后,所有甚至模糊不尋常的字符(% 除外)都被編碼為 %nn,因此在很大程度上避免了文件名中的空格、跨平台支持和模式匹配的任何問題。

  • 我知道事實上 PHP 本身可以與 Unicode URL 一起使用,因為我嘗試在 MediaWiki 中使用 Unicode 頁面名稱(基於 PHP,也可以運行 WikiPedia)。 例如,/index.php/Page_name© 等 URL。 所以 PHP 可以處理。 但它可能是 Apache 找到源文件具有 UTF-8 名稱的文件的問題。

  • 字符編碼的 PHP.ini 設置不應影響這一點; web 服務器的工作是查找特定資源,然后在確定為 PHP 文件后調用 PHP。 這意味着 web 服務器和底層文件系統本身必須能夠處理 UTF-8 文件名。

  • 沒有 mod_rewrite 規則它可以工作嗎? 即,如果您在關閉 RewriteEngine 的情況下禁用重寫引擎,然后請求 va.in/utf_dir/utf_file.php? 如果是這樣,則可能是 mod_rewrite 配置問題或規則問題。

  • 當您只輸入地址時,某些瀏覽器(例如舊版瀏覽器)可能無法正確支持 URL 中的 Unicode。 較舊的瀏覽器可能會跳過 UTF-8 編碼步驟。 但是,如果您關注頁面上的鏈接,這不應該阻止它工作,該頁面是 UTF-8 編碼的。

僅僅因為字符集是 UTF-8 並不意味着它支持 Unicode 的所有更高字符。

Z7F6C02D96265D1D37B1101DE1101541Z支持是Z2FEC392304A5C238DA222847F9B7CZ 6和Z2FEC392392304A5C238DAC138DAC12222222287FFERFEC138DBBFFEC138DBBFFEC138DBBIIous是Z2FEC392304A5C238DAAC138DAAC138DAC138DBER FORENER FORENFENBBFFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFERFIIS。

如果您的 PHP 腳本正在生成鏈接,則與 apache 直接解釋 url 並重定向它可能是不同的問題。

No. PHP filenames must be in ASCII, it does not matter how you set up your server PHP5 can't cope so we wait for PHP 6. Within a PHP script you can handle utf-8 filename/url using utf8_decode. 您可以使用 .htaccess 和 SQL 來解決很多問題,但無法運行 unicode 文件名。

大衛厄爾的回答是正確的。

使用“wfio://”進行復制寫入,etc。

https://github.com/kenjiuno/php-wfio

對於文件夾:

.htaccess:

php_value auto_prepend_file C:/fix.php

修復.php:

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

但更適合 php 使用 Linux 操作系統

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM