將 PHP 應用程序從 Windows Server 2003 遷移到 Linux 時的文件名編碼問題
我有幾個 PHP 應用程序實際上在 Windows 2003 Server 上執行。由於他們實際上在 Windows 上使用 PHP、Mysql 甚至 Apache,因此該項目是將它們移動到新的 Linux 伺服器(基於 Debian)。
但是當“特殊字元”(非ASCII文件,如éèàç)用於文件名(在法語中是正常的)時,使用者上傳的文件出現問題。
例如,文件“accusé réception.pdf”的儲存方式如下:
$ ls accus? r?ception.pdf
當我在 Linux 伺服器上上傳新文件時,似乎沒有問題:文件將在 fs 上命名,但應用程序可以找到它。問題在於遷移的內容,文件可用但應用程序找不到它!
我想知道問題可能來自哪裡:
- 文件系統字元/編碼表,我認為它來自這裡
- 應用程序本身的 php 程式碼,這將是一個問題,因為我無法更改它。我可以送出錯誤請求,但我不確定它們何時會得到修復。
- 另一個問題
最重要的是,我需要找到一種方法來解決這個問題。因為它只發生在遷移的數據上,所以我可以編寫一個腳本或調整我的 fs/php/whatever 以在將這些應用程序投入到 Linux 伺服器上時解決它。
在此先感謝您的幫助。
注意:當應用程序找不到文件時,我的 Apache 日誌中充滿了“readdir() 期望參數 1 是資源,布爾值在 …”中給出的錯誤
我終於找到了一些關於我的問題的資訊,以及一種解決方法。開發這些 php 應用程序的公司告訴我使用 iso-8859-1 來提供儲存的文件,以這種方式配置 Apache。它沒有解決我的問題,但給了我一個想法。
我使用 convmv http://www.j3e.de/linux/convmv/man/(感謝How to tell the language encoding of a filename on Linux?)將文件名從 utf-8 轉換(複製到 debian 使它們成為 utf -8 我認為)到 iso-8859-1
$ convmv -f utf-8 -t iso-8859-1 --no-test -r *
它解決了我的問題,因為我的應用程序現在可以找到儲存的文件(那些遷移的和新的)。
唯一的問題是在我的外殼上我仍然看不到正確的文件名:
$ ls test ��.xls $ LANG=fr_FR.UTF-8 ls test ??.xls
但這是一個“小”問題。
ps:很抱歉原始問題沒有正確暴露問題,並且這麼晚才回答解決方案
Windows 通常使用 unicode 來編碼非 ASCII 字元,所以如果你在你的 debian 伺服器上使用 unicode-locale,你就已經設置好了。它不一定是法語,因為您嘗試使用的字元是法語專業(剛剛測試過,我的 LANG 設置為 en_US.UTF-8,我可以創建一個具有您提到的名稱的文件( “accusé réception.pdf”),它也以這種方式顯示。
重音可能存在,只是無法顯示。要測試這個理論,請將“ls”命令替換為“LANG=en_US.UTF8 ls”。如果它正確顯示,它只是你的終端。只需在 shell 的啟動文件(例如 .bashrc)或系統範圍的 /etc/default/locale 中設置 LANG 變數