2015-12-02 31 views
1

我想從我的數據庫創建數據文件。而且我很難弄清楚如何將正確的編碼轉換爲windows文件名。從特定數據庫的文件名設置正確的編碼

該數據庫位於latin1_german2_ci,其中包含德文字符ä,ö,ü。現在我需要從數據庫獲取數據並從中構建一個文件。 爲exampe我$name從數據庫$name = "zäng" and "$id = "123"

第一:

$folder_name = $id . ' - ' . $name; 
mkdir($folder_name); 
$file_name = $folder_name . '/' . $id; 
file_put_contents($file_name . '.lic', $contents); 

此創建文件夾123 - zäng,這是正確的。一些文件被添加到像123.lic, 123.rom文件夾...

下一步,我想創建一個同名的zip文件:

$zip = new ZipArchive(); 
$zip_name = $folder_name . '.zip'; 
$zip->open($zip_name, ZipArchive::CREATE | ZipArchive::OVERWRITE) 
// to confirm its working, add an empty folder to the zip 
$zip->addEmptyDir("testfolder"); 

此創建一個文件名與123 - zäng.ziptestfolder。完美地工作。
現在發生了一些奇怪的事情,我必須創建一個與zip文件具有相同名稱的子文件夾,並將一些文件添加到子文件夾中。我嘗試用addFile來實現這一目標:

$zip->addFile($file_name . '.lic', $folder_name . '/' . $id . '.lic'); 

應該創造這樣的事情:

123 - zäng.zip/123 - zäng/123.lic 

而是我在zip文件中創建的文件夾把名字RI15120201 - zõng,特殊字符是錯誤的。 ZipArchive -API,有人說

ZipArchive使用IBM850編碼的文件名(本地名稱)。對於具有特殊字符的文件名,如(é)é它出現在ISO-8859-1的0xE9處,它在IBM850的0x82處。我必須調用iconv('ISO-8859-1','IBM850','Québec')來獲取正確的文件名。

另外,我發現

LATIN1(CP1252西歐)校對:

latin1_bin

latin1_danish_ci

latin1_german1_ci

latin1_german2_ci

,所以我改變了代碼:

iconv('cp1252', 'ibm850', $name); 
$folder_name = $id . ' - ' . $name; 
mkdir($folder_name); 
$file_name = $folder_name . '/' . $id; 
file_put_contents($file_name . '.lic', $contents); 

但它並沒有改變任何東西。我錯過了什麼?而且爲什麼mkdir$zip->open在不轉換編碼的情況下工作?

回答

2

這是因爲你你可能需要做同樣不分配是由的iconv()

變化

iconv('cp1252', 'ibm850', $name); 

$name = iconv('cp1252', 'ibm850', $name); 

返回新值與$內容

+0

噢,我的天啊,就是這樣....'mkdir'和'$ zip-> open'雖然給出了錯誤的名稱,所以我將l在'$ zip = new ZipArchive'這一行之後,它現在可以完美工作了!非常感謝你。我猜'mkdir'和'$ zip-> open'使用「正常」編碼工作? – yangsunny

+0

我認爲mkdir它基於你工作的操作系統 – Robert

+0

我只是發現ZipArchive :: open()工作正常,但ZipArchive :: addFile需要特殊的編碼......花了我幾個小時才弄清楚了第一個地方。 。 – yangsunny

相關問題