我想從我的數據庫創建數據文件。而且我很難弄清楚如何將正確的編碼轉換爲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.zip
子testfolder
。完美地工作。
現在發生了一些奇怪的事情,我必須創建一個與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
在不轉換編碼的情況下工作?
噢,我的天啊,就是這樣....'mkdir'和'$ zip-> open'雖然給出了錯誤的名稱,所以我將l在'$ zip = new ZipArchive'這一行之後,它現在可以完美工作了!非常感謝你。我猜'mkdir'和'$ zip-> open'使用「正常」編碼工作? – yangsunny
我認爲mkdir它基於你工作的操作系統 – Robert
我只是發現ZipArchive :: open()工作正常,但ZipArchive :: addFile需要特殊的編碼......花了我幾個小時才弄清楚了第一個地方。 。 – yangsunny