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

Php 使用特殊字符为数据库中的文件名设置正确的编码,php,encoding,special-characters,ziparchive,Php,Encoding,Special Characters,Ziparchive,我正在尝试使用数据库中的数据创建文件。我很难找出如何将windows文件名转换为正确的编码 数据库是拉丁文的,包含德语字符,如ä,ö,ü。现在我需要从数据库中获取数据并从中构造一个文件。 例如,我使用$name=“zäng”和“$id=“123” 第一: $folder_name = $id . ' - ' . $name; mkdir($folder_name); $file_name = $folder_name . '/' . $id; file_put_contents($file_na

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

数据库是拉丁文的,包含德语字符,如ä,ö,ü。现在我需要从数据库中获取数据并从中构造一个文件。 例如,我使用
$name=“zäng”和“$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对文件名(localname)使用IBM850编码。对于带有特殊字符的文件名,例如ISO-8859-1中出现在0xE9处的(é)é,它在IBM850中出现在0x82处。我必须调用iconv(“ISO-8859-1”、“IBM850”、“魁北克”)才能获得正确的文件名

另外,我发现

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

拉丁语1_bin

拉丁语丹麦语

拉丁语

拉丁语

所以我改变了密码:

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);


你可能需要对$contents做同样的处理

哦,我的天啊,就是这样….
mkdir
$zip->open
给出了错误的名称,所以我将行移到了
$zip=new ZipArchive
行之后,它现在工作得很好!非常感谢你。我猜
mkdir
$zip->open
与一起工作吧““正常”编码?我只是觉得奇怪ZipArchive::open()工作正常,但ZipArchive::addFile需要特殊编码…我花了几个小时才弄明白。。。
$name = iconv('cp1252', 'ibm850', $name);