2013-04-08 74 views
2

我使用mkdir()通過PHP在波斯語和阿拉伯語言中創建了一些目錄。將unix/linux文件名字符集轉換爲windows

我想將文件夾移入窗口,但文件夾名稱有問題。

例如:我這樣寫道: 「سلام」

但在Windows告訴我未知字符:「ط³غŒط³طھظ...ط¹ط§ظ......ظ「ط¬ظ「طط¯ظظ......」

看來,這應該轉換爲除UTF-8以外的其他編碼

對不起,如果我的英文不太好。

謝謝。

編輯: 我用這個PowerShell代碼,併爲我工作:

Get-ChildItem | ForEach-Object { 
    $filename = Split-Path -Leaf $_ 
    $new = [Text.Encoding]::Utf8.GetString([Text.Encoding]::Default.GetBytes($filename)) 
    if ($_.Name -ne $new) { 
    Rename-Item $_ $new 
    } 
} 
enter code here 

,但我想上面的代碼來糾正所有子文件夾的名字太...

+0

您是如何在Linux和Windows之間移動文件夾的? – theglauber 2013-04-08 18:57:12

+0

是的。我在Linux中通過PHP使用mkdir,現在想移動到Windows ... – 2013-04-08 19:17:55

+1

是的,但是如何?閃存盤,硬盤或類似的東西?哪個文件系統? ([FAT32,Ntfs,...?](http://msdn.microsoft.com/en-us/library/windows/desktop/dd317752%28v=vs.85%29.aspx))或通過網絡複製?你壓縮文件還是複製它們? – mata 2013-04-08 20:02:55

回答

3

seems it should be convert to other encoding except UTF-8

是:當您使用C標準庫基於字節的文件接口中的文件名字符串(這是PHP和大多數其他跨平臺語言所做的),您將獲得Windows默認('ANSI')代碼頁。這種編碼是依賴於語言環境的,並且加重不會是UTF-8。

在你的情況下,通過上面的文件名判斷,你的默認代碼頁是1256阿拉伯語。如果您編碼您的文件名作爲cp1256那麼這應該工作:

$localfilename= iconv('utf-8', 'windows-1256', $filename); 

但是:

  • 這將意味着你只能使用阿拉伯語(和ASCII)字符的文件名 - 任何其他的Unicode字符將打破;

  • 如果將其部署在默認代碼頁不是1256的其他服務器上,這種情況自然會失敗。服務器在美國區域設置中運行並且代替第1252頁西歐代碼頁很常見。

雖然你可以在一般的變化代碼頁和UTF-8是在原則上可在Windows爲65001代碼頁,有一堆與它的錯誤,可能使該不能用於此目的的 - UTF- 8是Windows下的二等公民。 (在任何情況下,Web服務器線程中改變的語言環境都是不可靠的)

獲得完整的Unicode文件名以在Windows中工作的唯一方法是調用本機Win32 API函數來訪問文件(使用UTF-16LE字符串)的C標準庫函數。這就是PowerShell/.NET所做的 - 因爲它是可以直接使用Win32函數的Windows專用軟件。 Python也支持使用Win32代替C的Unicode文件名。

但是PHP目前沒有這種功能。您可以手動使用w32api_invoke_function直接調用Win32 API CreateDirectoryW,但這樣做會很不方便。

這是爲什麼最好避免使用任意輸入作爲文件名的一個原因,如果可能的話!

+0

第一個解決方案非常好。 我使用的代碼在一段時間重命名的子目錄... 但是,對於一個文件夾返回錯誤: 注意:的iconv():檢測到輸入字符串非法字符。 tnx :) – 2013-04-09 15:47:06

+0

@Ramin:是的,遇到任何不在阿拉伯語代碼頁1256中的字符時會發生這種情況。如果使用目標編碼「windows-1256 // IGNORE」,那麼它會默默地扔掉這些字符而不是提出錯誤,但顯然這意味着丟失數據。 – bobince 2013-04-09 15:54:20

+0

Finaly我使用代碼來替換和防止丟失一些數據(波斯語/波斯語): $ localfilename = str_ireplace('ی','í',$ localfilename); 然後我們可以重命名文件夾:) – 2013-04-10 10:42:59