2015-02-12 147 views
0

我需要使用特殊的ISO-8859-15字符將文件寫出到磁盤。對於我自己的測試目的,我用:PHP:如何使用Unicode字符將文件寫入磁盤

- ©®±àáâãäåæÒÓÔÕÖ¼½¾§μçðþú-.JPG

...但破折號,短破折號,以及1/2,1/4,當文件被寫入到具有該名稱的磁盤時,3/4部分被替換爲垃圾,而文件名中的其他字符被正確寫出。爲什麼有些而不是其他?

這是一個簡單的PHP腳本來寫出一個文件,其名稱中只有版權符號和em-dashes。當我運行它,將字符串寫入文件正確,但文件名的長劃線與垃圾代替:

<?php 
    // First, create a text file with the em-dash and the copyright symbol, then put the file prefix into the file: 
    $filename1 = "000—©—©.txt"; 
    $content1 = "000—©—©"; 
    file_put_contents($filename1, $content1); 
?> 

什麼是最有效和最優雅的方式來做到這一點使用PHP(或JavaScript)?我只針對ISO-8859-15字符集。

非常感謝! 湯姆

+0

確保您使用保存PHP文件將在你的目標字符集或這個東西保存的文本編輯器會瞬間都被轉換爲ASCII垃圾只是節省了PHP代碼的行爲。 – developerwjk 2015-02-12 00:06:18

+0

在ISO-8859-15編碼中不存在'--¼½¾'字符。他們使用類似的Windows代碼頁1252編碼,而分數則使用類似的ISO-8859-1編碼。 ISO-8859-15很少使用。 – bobince 2015-02-12 11:10:50

回答

1

我找到了我自己的答案。首先,我需要WINDOWS-1252編碼,事實證明。第二,所有我需要做的是利用inconv(),從「UTF-8」轉換爲「WINDOWS 1252」,像這樣:

<?php 
    // First, create a text file with the em-dash and the copyright symbol, then put the file prefix into the file: 
    $filename1 = "000—©—©.txt"; 
    $content1 = "000—©—©"; 

    // Judicious use of iconv() does the trick: 
    $filename1 = iconv('UTF-8', 'WINDOWS-1252', $filename1); 
    file_put_contents($filename1, $content1); 
?> 

我唯一揮之不去的問題,只要我在這個測試在我的本地Windows機器上使用XAMPP,是否WINDOWS-1252編碼能夠在主要託管服務(GoDaddy等)上的實際服務器上工作。如果不是,是否有不同的編碼支持WINDOWS-1252中包含的所有內容,但更適合非-XAMPP本地主機服務器?

有一個由iconv here支持的完整編碼列表。幾個與WINDOWS-1252在同一行;這是否意味着它們可以互換?

非常感謝, 湯姆

+0

代碼頁1252是西歐語言環境中的「ANSI代碼頁」(對於使用MS C運行時進行文件訪問的應用程序的默認值)。在其他地區,您可能會得到不同的結果。在非Windows服務器上,文件命名方案基於字節,因此沒有固有編碼,但通常現代Linux服務器更喜歡UTF-8。所以不幸的是,跨平臺沒有好的答案。由於這是非常不可靠的,通常最好避免在文件名中放入非ASCII。 – bobince 2015-02-12 11:04:34

相關問題