使用特殊字符为数据库中的文件名设置正确的编码
set the right encoding for file name from database with speical character
我正在尝试使用我的数据库中的数据创建文件。我很难弄清楚如何为 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 uses IBM850 encoding for filenames (localname). For filenames with special characters such as (é) é which appears at 0xE9 in the ISO-8859-1, it is at 0x82 in IBM850. I had to call iconv('ISO-8859-1', 'IBM850', 'Québec') to get correct file names.
另外,我发现
latin1 (cp1252 West European) collations:
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
在不转换编码的情况下工作?
这是因为你没有给iconv()返回的新值赋值
改变
iconv('cp1252', 'ibm850', $name);
到
$name = iconv('cp1252', 'ibm850', $name);
您可能需要对 $contents
执行相同的操作
我正在尝试使用我的数据库中的数据创建文件。我很难弄清楚如何为 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 uses IBM850 encoding for filenames (localname). For filenames with special characters such as (é) é which appears at 0xE9 in the ISO-8859-1, it is at 0x82 in IBM850. I had to call iconv('ISO-8859-1', 'IBM850', 'Québec') to get correct file names.
另外,我发现
latin1 (cp1252 West European) collations:
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
在不转换编码的情况下工作?
这是因为你没有给iconv()返回的新值赋值
改变
iconv('cp1252', 'ibm850', $name);
到
$name = iconv('cp1252', 'ibm850', $name);
您可能需要对 $contents
执行相同的操作