Php folder-file 创建编码问题

Php folder-file creation encoding issues

我在使用 cakephp 3 的 Folder and File libraries 创建文件和文件夹时遇到问题(虽然它在后端是 php 的 mkdir)。

PHP版本为7.0.28

步骤:

  1. 用户上传文件(希腊字符)
  2. 系统处理一些不相关的验证等
  3. 系统创建路径以将文件保存在自定义文件夹中并将位置保存在数据库中 table 如下所示:documents. DS . $user->username . DS . $file->protocol . $file->file_type . DS . $file->name 示例路径看起来像

/documents/user/Κ.300/Κ.310_6_4092.pdf

  1. 在我的 ubuntu 环境中,它工作正常,但是在 windows 服务器 2012 R2 上,希腊字符部分看起来有编码问题,就像这样(对质量不好表示歉意)

我已经尝试了很多事情,这是我目前所知道的:

illegal input sequence at position

这是 底层代码:

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

'/inbox/documents/someUser/εξερχομενο/Κ.900'

'��/inbox/documents/someUser/����������/�.900'

debug(iconv('UTF-8', 'GREEK', $path));

'inbox/documents/someUser/���������/�.900'

debug(iconv('UTF-8', 'Windows-1252', $path));

[https://secure.php.net/function.iconv'>function.iconv]: Detected an illegal character in input string

当我输入任何一个转换后的编码路径到 $folder->create($path) 时,如果我得到任何路径,我仍然得到虚假路径。

如何为 windows Server 2012 xampp 创建正确的文件和文件路径?

更新

经过几个小时的测试,在我的 windows 服务器中,我通过表单发送的希腊字符数据显示不正确,因为 windows 通过 Windows-1251编码。 在 phpmyadmin 中,它们都显示正确,但如果我在我的系统 运行 中间放置一个断点,它们看起来与我显示的屏幕截图类似。此外,我的回复 headers 的 character-set 是 Windows-1251 for windows,utf-8 for ubuntu。所以我尝试将我的 utf-8 数据转换为 windows-1252 但我的希腊语输入仍然变成了问号。仍然没有解决方案

对于那些和我有同样问题的人,主要是希腊开发者,这里是根据用户输入创建具有希腊名称的文件夹和文件的答案:

  1. 将系统区域设置更改为希腊语(或您想要的语言),如 so
  2. 当您通过表单获取输入时(假设输入编码为 UTF-8),将其转换为 ISO-8859-1 或 Windows-1253。如果你把它转换成Windows-1253你只能使用php的函数iconv。对于 ISO-8859-1,您可以使用 mb_convert_econding。像这样:

    $input = iconv('UTF-8', 'Windows-1253', $input)

    $input = mb_convert_encoding($input, 'ISO-8859-1')

  3. 现在您可以创建希腊语文件夹了。请记住 Windows-1252 或 Windows-1251 支持希腊字符,而 Windows-1253 只有在您更改系统语言环境也改为希腊语。

  4. 你还没有完成! 根据你的数据库编码(在我的例子中是 UTF-8)你 将字符串转换回 UTF-8(如果您打算存储它)。或者你可以在一开始就复印一份。无论如何,不​​要将转换后的输入存储在您的数据库中,否则您最终会得到一堆存储的乱码。

我希望这能为别人省去我必须经历的麻烦!