我想从我的数据库创建数据文件。而且我很难弄清楚如何将正确的编码转换为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