2015-12-02 30 views
1

我想从我的数据库创建数据文件。而且我很难弄清楚如何将正确的编码转换为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.ziptestfolder。完美地工作。
现在发生了一些奇怪的事情,我必须创建一个与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在不转换编码的情况下工作?

回答

2

这是因为你你可能需要做同样不分配是由的iconv()

变化

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

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

返回新值与$内容

+0

噢,我的天啊,就是这样....'mkdir'和'$ zip-> open'虽然给出了错误的名称,所以我将l在'$ zip = new ZipArchive'这一行之后,它现在可以完美工作了!非常感谢你。我猜'mkdir'和'$ zip-> open'使用“正常”编码工作? – yangsunny

+0

我认为mkdir它基于你工作的操作系统 – Robert

+0

我只是发现ZipArchive :: open()工作正常,但ZipArchive :: addFile需要特殊的编码......花了我几个小时才弄清楚了第一个地方。 。 – yangsunny

相关问题