【问题标题】:PHP - FTP filename encoding issuePHP - FTP文件名编码问题
【发布时间】:2021-05-13 00:50:09
【问题描述】:

我会很简短。我的 FTP 函数返回错误的文件名编码

$conn_id = ftp_connect("site.com");
ftp_login($conn_id, "login", "pass");
ftp_pasv($conn_id, true);
$buff = ftp_nlist($conn_id, "./");
print_r($buff);

->  // result
    array() {
        [0]=> "��.txt"
    }

文件名采用 Windows-1251 编码。

我尝试通过 nodejs 连接到 FTP,但它也返回了一些令人毛骨悚然的东西 — òð.txt

我的桌面客户端 (WinSCP) 可以正常工作。

PS:我尝试使用 utf8_encode - 但这也不适合我。

【问题讨论】:

  • 如果添加 header('Content-Type: text/html; charset=windows-1251'); 会发生什么到你的脚本?
  • @jamie0726,好建议!它还以正确的编码返回结果。如果我需要传输具有特定编码的文件,这将是一个很好的解决方案。但是对我来说是需要自动检测每个文件的编码。
  • 我有这个问题,如何解决?

标签: php encoding ftp


【解决方案1】:

许多(但不是全部)ftp 服务器支持 UTF-8 路径名编码。您可以通过在ftp_nlist 调用之前发出“OPTS UTF8 ON”命令来打开此功能。

ftp_raw('OPTS UTF8 ON');

【讨论】:

  • 有效!很好~~~ ftp_raw($conn_id, 'OPTS UTF8 ON');
【解决方案2】:

您可以尝试使用iconv 函数。希望它能解决你的问题。

【讨论】:

    【解决方案3】:

    首先在页面上添加内容类型。

    header('Content-Type: text/html; charset=utf-8');
    

    然后试试这个,希望对你有帮助

    str_replace(array('%82','%94','+'),array('é','ö',' '),urlencode($folder_name));
    

    这不是最好的方法,但它对我有用,如果你对一个字符串进行 url 编码,它会将尴尬的字符更改为例如%82... 然后您可以将这些替换为 HTML 代码。

    【讨论】:

      【解决方案4】:

      如果编码是你可以尝试使用mb_convert_encoding 更改它。下面的代码应该输出正确的值。

      <?php
      echo mb_convert_encoding($buff[0], "UTF-8");
      //or
      echo mb_convert_encoding($buff[0], "UTF-8", "windows-1251");
      ?>
      

      如果它不起作用,您可以尝试使用类似的方法找到正确的编码

      <?php
      foreach(mb_list_encodings() as $chr){
        echo mb_convert_encoding($buff[0], 'UTF-8', $chr)." : ".$chr."<br>"; 
      } 
      ?>
      

      【讨论】:

      • 感谢 Hugo,这个 mb_convert_encoding($buff[0], "UTF-8", "windows-1251"); 对我有用,但前提是文件名采用 windows-1251 编码。但它也可能是任何其他编码,那么是否有一些可靠的方法来自动检测它?我尝试使用mb_detect_encoding,但它没有返回正确的编码:(
      • 检查 stackoverflow.com/questions/910793/… 以获得有关将编码更改为 utf-8 的广泛答案
      • @artnikpro 为什么你认为它可以是任何其他编码?同一台机器不是只有一个编码吗?因为如果不是,那么你只会得到字节(而不是字符),并且无法确定它是什么,它甚至可能是你所知道的一些狗编码。即使将每个字符解析为某种编码中的某些西里尔字符确实有意义,您仍然不确定(除非它是某种语言中的真实单词,但谁拥有所有这些字典)。所以我要说的是,这是您将得到的最佳答案,因为您(可能)正在考虑的事情是不可能的。
      • 对另一个问题的引用应该在您的主要答案中。太棒了。
      猜你喜欢
      • 2011-05-16
      • 1970-01-01
      • 2013-01-28
      • 2010-12-11
      • 1970-01-01
      • 2021-07-19
      • 2011-05-23
      • 1970-01-01
      相关资源
      最近更新 更多