Php文件夹文件创建编码问题

时间:2018-05-26 13:25:28

标签: php cakephp utf-8 character-encoding cakephp-3.0

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

PHP版本为7.0.28

步骤:

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

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

    1. 在我的ubuntu环境下,它工作正常,但在Windows Server 2012 R2上,希腊字符部分看起来像是有编码问题,就像这样(道歉质量不好)enter image description here
    2. 我尝试过很多东西,到目前为止我知道的是:

      • Ubuntu 16.04使用与php相同的UTF-8编码,这就是为什么该文件夹在我的开发环境中看起来很好。
      • Windows使用UTF-16(我相信,我不是100%肯定)这是我应该将其转换为,但当我尝试将路径转换为utf-16时,我得到以下iconv错误或希腊语字符看起来像问号,php无法创建目录:
        

      位置的非法输入序列

      这是 底层代码:

      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,但仍然,我的希腊语输入变成了问号。仍然没有解决方案

1 个答案:

答案 0 :(得分:0)

对于那些和我一样遭遇同样问题的人来说,主要是希腊开发人员在这里提供了从用户输入创建希腊语名称的文件夹和文件的答案:

  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)

    OR

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

  3. 现在您已准备好使用希腊语创建文件夹。请记住,如果您将系统区域设置更改为希腊语,则Windows-1252或Windows-1251 不要支持希腊字符,而Windows-1253只能正确显示它们。

  4. 您还没有完成!根据您的数据库编码(在我的情况下是UTF-8),您将字符串转换回UTF- 8如果你计划存储它。或者你可以在一开始就复制一份。在任何情况下,不要将转换后的输入存储在数据库中,否则最终会出现一堆存储的乱码。

  5. 我希望这可以节省一些我必须经历的麻烦!

相关问题