我正在尝试使用数据库中的数据创建文件。而且我很难找出如何转换为Windows文件名的正确编码。
数据库位于中latin1_german2_ci
,其中包含诸如ä,ö,ü的德语字符。现在,我需要从数据库中获取数据并从中构建文件。例如我$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文件中创建的文件夹名为name RI15120201 - zõng
,特殊字符错误。在ZipArchive
-API中,有人说
ZipArchive对文件名(本地名)使用IBM850编码。对于带有特殊字符的文件名,例如(é)é在ISO-8859-1中显示为0xE9,在IBM850中为0x82。我必须调用iconv('ISO-8859-1','IBM850','魁北克')来获取正确的文件名。
另外,我发现
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
工作而无需转换编码?
这是因为您没有分配iconv()返回的新值
改变
iconv('cp1252', 'ibm850', $name);
到
$name = iconv('cp1252', 'ibm850', $name);
您可能需要对$ contents做同样的事情
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句