我在使用cakephp 3的Folder and File libraries创建文件和文件夹时遇到问题(虽然它的后端是php的mkdir)。
PHP版本为7.0.28
步骤:
documents. DS . $user->username . DS . $file->protocol . $file->file_type . DS . $file->name
示例路径看起来像/documents/user/Κ.300/Κ.310_6_4092.pdf
我尝试过很多东西,到目前为止我知道的是:
位置的非法输入序列
这是 底层代码:
public function setPath(array $data)
{
Configure::load('file_directories', 'default');
$path = $this->createPathFromData($data);
$folder = new Folder('/');
$folder->create($path);
$this->directory = new Folder($path);
if (!$this->validateDirectory()) {
throw new Exception('Something went wrong when creating directories');
}
}
以下是一些调试输出:
debug(mb_detect_encoding($path));
UTF-8
debug($path);
debug(iconv('UTF-8', 'UTF-16', $path));
'/收件箱/文件/ SomeUser是否/εξερχομενο/Κ.900'
'/收件箱/文件/ SomeUser是否//。900'
debug(iconv('UTF-8', 'GREEK', $path));
'收件箱/文件/ SomeUser是否//。900'
debug(iconv('UTF-8', 'Windows-1252', $path));
[https://secure.php.net/function.iconv'>function.iconv]:检测到输入字符串中的非法字符
当我输入转换到$folder->create($path)
的任何一个转换编码路径时,如果我得到任何路径,我仍会得到伪造路径。
如何为Windows Server 2012 xampp创建正确的文件和文件路径?
更新
经过几个小时的测试后,在我的Windows服务器中,我通过表单发送的希腊字符数据显示不正确,因为Windows通过Windows-1251编码显示它们。
在phpmyadmin中它们都显示正确,但是如果我在系统运行过程中设置了断点,它们看起来与我显示的屏幕截图类似。此外,我的响应标头的字符集对于Windows是Windows-1251
,对于ubuntu是utf-8
。所以我尝试将我的utf-8数据转换为windows-1252,但仍然,我的希腊语输入变成了问号。仍然没有解决方案
答案 0 :(得分:0)
对于那些和我一样遭遇同样问题的人来说,主要是希腊开发人员在这里提供了从用户输入创建希腊语名称的文件夹和文件的答案:
当您通过表单输入时(假设输入编码为UTF-8)将其转换为ISO-8859-1或Windows-1253。如果将其转换为Windows-1253,则只能使用php的功能iconv。对于ISO-8859-1,您可以使用mb_convert_econding。像这样:
$input = iconv('UTF-8', 'Windows-1253', $input)
OR
$input = mb_convert_encoding($input, 'ISO-8859-1')
现在您已准备好使用希腊语创建文件夹。请记住,如果您将系统区域设置更改为希腊语,则Windows-1252或Windows-1251 不要支持希腊字符,而Windows-1253只能正确显示它们。
您还没有完成!根据您的数据库编码(在我的情况下是UTF-8),您已将字符串转换回UTF- 8如果你计划存储它。或者你可以在一开始就复制一份。在任何情况下,不要将转换后的输入存储在数据库中,否则最终会出现一堆存储的乱码。
我希望这可以节省一些我必须经历的麻烦!