使用特殊字符为数据库中的文件名设置正确的编码


set the right encoding for file name from database with speical character

我正在尝试用数据库中的数据创建文件。我很难弄清楚如何将windows文件名转换为正确的编码。

数据库位于latin1_german2_ci中,其中包含德语字符,如ä,ö,ü。现在我需要从数据库中获取数据,并从中构造一个文件。例如,我用$name = "zäng" and "$id = "123" 从数据库中得到了$name

第一个:

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

这创建了正确的文件夹123 - zäng。并且一些文件被添加到文件夹中,如CCD_ 5。。。

下一步,我想创建一个同名的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");

这创建了一个名为CCD_ 6和子文件夹CCD_。效果也很好
现在发生了一些奇怪的事情,我必须创建一个与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对文件名(localname)使用IBM850编码。对于具有特殊字符(如(é)é)的文件名,在ISO-8859-1中出现在0xE9处,在IBM850中则为0x82。我不得不调用iconv('ISO-8859-1','IBM850','Québec')来获得正确的文件名。

另外,我发现

拉丁语1(cp1252西欧)校勘:

latin1_bin

latin1_nish_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 做同样的操作