跳过文件名中的非 ASCII 字符
Non ASCII Characters in filename are skipped
程序 youtube-dl
本身支持文件名中的非 ASCII 字符,它在我的网络服务器上以 root 用户和 www-data 用户完美运行,但是当我尝试使用 youtube-dl 下载视频时PHP,非ASCII字符被完全跳过。
例如:Stromae - bâtard
将保存为 Stromae - btard.mp4
或 البث الحي
为 .mp4
我正在使用此代码 运行 CLI 命令
function cmd($string) {
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
$process = proc_open($string, $descriptorspec, $pipes);
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
$ret = proc_close($process);
return $stdout;
}
$value = ('youtube-dl https://some.valid/link');
echo cmd($value);
请告知我应该如何解决此问题。
默认情况下 PHP 使用 ISO-8859-1 字符集。配置 PHP 以使用 UTF-8。您可以通过添加
mb_internal_encoding("UTF-8");
在脚本的开头
检查你的phpinfo(); LC_ALL 或 LC_LANG 设置的输出。我怀疑它与 PHP 无关,但与您正在使用的 shell 环境和您的 Web 服务器正在使用的 shell 环境有关。
$value = ('LC_ALL=en_US.UTF-8 youtube-dl https://some.valid/link');
echo cmd($value);
程序 youtube-dl
本身支持文件名中的非 ASCII 字符,它在我的网络服务器上以 root 用户和 www-data 用户完美运行,但是当我尝试使用 youtube-dl 下载视频时PHP,非ASCII字符被完全跳过。
例如:Stromae - bâtard
将保存为 Stromae - btard.mp4
或 البث الحي
为 .mp4
我正在使用此代码 运行 CLI 命令
function cmd($string) {
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
$process = proc_open($string, $descriptorspec, $pipes);
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
$ret = proc_close($process);
return $stdout;
}
$value = ('youtube-dl https://some.valid/link');
echo cmd($value);
请告知我应该如何解决此问题。
默认情况下 PHP 使用 ISO-8859-1 字符集。配置 PHP 以使用 UTF-8。您可以通过添加
mb_internal_encoding("UTF-8");
在脚本的开头
检查你的phpinfo(); LC_ALL 或 LC_LANG 设置的输出。我怀疑它与 PHP 无关,但与您正在使用的 shell 环境和您的 Web 服务器正在使用的 shell 环境有关。
$value = ('LC_ALL=en_US.UTF-8 youtube-dl https://some.valid/link');
echo cmd($value);