2009-06-10 41 views
7

例如我有一個像這樣的文件名 - проба.xml,我無法從PHP腳本中打開它。如何在名稱中包含unicode字符的PHP中打開文件?

如果我安裝PHP腳本使用UTF-8比在腳本中的所有文本是utf-8這樣當我通過這的file_get_contents:

$fname = "проба.xml"; 
file_get_contents($fname); 

我得到錯誤文件不存在。原因是在Windows(XP)中,所有帶非拉丁字符的文件名都是unicode(UTF-16)。行,所以我嘗試這樣做:

$fname = "проба.xml"; 
$res = mb_convert_encoding($fname,'UTF-8','UTF-16'); 
file_get_contents($res); 

但錯誤依然存在,因爲的file_get_contents不能接受Unicode字符串...

有什麼建議?

+0

此代碼是否爲最新版本?您沒有在file_get_contents中將$ fname與$ res切換,還是僅僅是一個錯字? – ryanday 2009-06-10 19:37:17

+0

這是我的錯字。我確實切換了值。 – 2009-06-10 22:02:32

+0

我到了我的XP系統並嘗試了你的代碼。我用unicode保存了PHP文件,並複製/粘貼了你寫的內容,並且可以讀取該文件(相同的文件名)。什麼編碼是你的源文件保存在? – ryanday 2009-06-11 00:56:33

回答

0

這些結論至今:

  1. PHP 5無法打開文件名Unicode字符,除非源文件名是unicode。
  2. PHP 5(至少在Windows XP上)無法在unicode中處理PHP源代碼。

這樣的結論,這在PHP 5

0

你可以嘗試:

  • 獲取字符串從目錄使用執行opendir和readdir的
  • 傳遞一個字符串file_get _contents,看看是否會工作列出文件名,或者
  • 嘗試獲得該文件的內容使用fopen,fread和fclose

希望這有助於!

8

UPDATE不可行(7月13日'17)

雖然文檔似乎沒有提到它,PHP 7.0及以上終於支持Unicode文件名上開箱即用的Windows。 PHP的Filesystem API根據default_charset接受並返回文件名,默認爲UTF-8

參見bug修復在這裏:https://github.com/php/php-src/commit/3d3f11ede4cc7c83d64cc5edaae7c29ce9c6986f


UPDATE(1月29日'15)

如果你有機會到PHP擴展目錄,你可以嘗試在https://github.com/kenjiuno/php-wfio安裝php-wfio.dll,並參考文件通過wfio://協議。

file_get_contents("wfio://你好.xml"); 

原來的答案

在Windows上使用PHP的遺產 「ANSI API的」 專供本地文件訪問,這意味着PHP使用系統區域設置,而不是統一的。

要訪問文件名包含Unicode的文件,必須將文件名轉換爲當前系統區域設置的指定編碼。 如果文件名包含不能用指定編碼表示的字符,那麼您的運氣不好。 scandir將返回這些文件的亂碼,並將字符串傳回fopen,並且等效將失敗。

要找到使用正確的編碼,可以通過調用<?=setlocale(LC_TYPE,0)?>,並在MSDN文章https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx仰視代碼頁標識(在.後的數字)獲得系統區域。

例如,如果函數返回Chinese (Traditional)_HKG.950,這意味着950代碼頁正在使用中,並且文件名應該轉換爲big-5編碼。在這種情況下,你的代碼將不得不如下,如果你的文件保存在UTF-8(最好是無BOM):

$fname = iconv('UTF-8','big-5',"你好.xml"); 
file_get_contents($fname); 

或如下如果你直接保存爲BIG-5的文件:

$fname = "你好.xml"; 
file_get_contents($fname); 
相關問題