PHP - FTP文件名编码问题
Posted
技术标签:
【中文标题】PHP - FTP文件名编码问题【英文标题】:PHP - FTP filename encoding issue 【发布时间】: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,好建议!它还以正确的编码返回结果。如果我需要传输具有特定编码的文件,这将是一个很好的解决方案。但是对我来说是需要自动检测每个文件的编码。 我有这个问题,如何解决? 【参考方案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
,但它没有返回正确的编码:(
检查 ***.com/questions/910793/… 以获得有关将编码更改为 utf-8 的广泛答案
@artnikpro 为什么你认为它可以是任何其他编码?同一台机器不是只有一个编码吗?因为如果不是,那么你只会得到字节(而不是字符),并且无法确定它是什么,它甚至可能是你所知道的一些狗编码。即使将每个字符解析为某种编码中的某些西里尔字符确实有意义,您仍然不确定(除非它是某种语言中的真实单词,但谁拥有所有这些字典)。所以我要说的是,这是您将得到的最佳答案,因为您(可能)正在考虑的事情是不可能的。
对另一个问题的引用应该在您的主要答案中。太棒了。以上是关于PHP - FTP文件名编码问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apache Commons Net 检测 FTP 服务器文件名编码