2015-05-09 106 views
0

我想使用PHP的file_put_contents()函數將文件名中包含unicode字符的文件(比如chinese,cyrillic,arabic等)保存爲一些數據。我不想單獨使用urlencode()來編碼它們,因爲如果只包含非拉丁字符,任何人都不能讀取文件名。最大的3個操作系統Windows,MacOS/OS X和Linux支持文件名中的UTF-8或UTF-16字符,並且可以毫無問題地顯示它們,但似乎並不像調用類似這樣簡單:PHP:使用Unicode文件名的file_put_contents()

file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . "こんにちは.txt", ""); 

ã「ã‚「ã«ã¡ã¯.txt 

的PHP文件本身被保存在UTF-8編碼:

在Windows 7(德語本地化)作爲文件存儲。在這3個系統的文件名中是否有統一的保存unicode文件的方法?

+0

你見過[this](http://stackoverflow.com/a/25395755/1459926)嗎? –

+0

urlify無法幫助中國等等。使用iconv('utf','local charset // translit',...),或使用PHP COM對象。 – Deadooshka

+0

@AlexandruGuzinschi是的,但這並沒有解決我的問題。 – StanE

回答

0

如回答here這是一個已知的Windows問題(glob() can't find file names with multibyte characters on Windows?)。

你可以嘗試URLify以減輕僅在Windows上的問題,文件應該有那麼可讀的名字......

+0

我不想要其他文件名(它們不能有區別)。 URLify將字符更改爲完全其他字符或完全忽略它們。在OS X 10.9.5上,我遇到了同樣的問題,但是這裏上面例子中的文件名導致了????? txt – StanE

+0

在PHP 5.6.3和Yosemite(OSX 10.10.3)中對我很好。在Windows上,您唯一的機會就是使用COM對象...引用來自此(http://stackoverflow.com/a/9882557/3950202)威脅的評論:「[...]很快得到了其中一個核心開發人員在同一個線程中,基本上你唯一的機會就是使用COM或接受這樣一個事實,即Windows上的PHP無法做到這一點。「 –

0

file_put_contents(__DIR___.iconv("UTF-8", "cp1251", $filename), $data); - 完美的作品!

+0

不幸的是沒有工作。嘗試'$文件名=「平がなприветSpäß.txt」;'。 iconv()表示「檢測到輸入字符串中的非法字符」並丟棄字符。使用「// TRANSLIT」將會音譯它們(我想要原始的字符),而「// IGNORE」會默默丟棄它們。 – StanE