从具有特殊字符的数据库中为文件名设置正确的编码

时间:2015-12-02 14:12:00

标签: php encoding special-characters ziparchive

我正在尝试使用数据库中的数据创建文件。我正在努力弄清楚如何转换为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文件中创建的文件夹名为RI15120201 - zõng,特殊字符错误。在ZipArchive - API中,有人说

  

ZipArchive对文件名(localname)使用IBM850编码。对于具有特殊字符的文件名,例如(é)é,它出现在ISO-8859-1的0xE9处,在IBM850中为0x82。我不得不打电话给iconv('ISO-8859-1','IBM850','Québec')来获取正确的文件名。

另外,我发现了

  

latin1(cp1252 West European)排序规则:

     

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无法转换编码?

1 个答案:

答案 0 :(得分:2)

这是因为您没有指定由iconv()

返回的新值

更改

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

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

您可能需要对$ contents

执行相同的操作