在Windows CMD的FOR循环中使用youtube-dl会剥离非ASCII字符

3

在CMD中直接使用youtube-dl命令可以正常工作:

youtube-dl -e "https://www.youtube.com/watch?v=E_JXrNAxGzM"

它可以正确地给出Youtube视频的标题:27/12/2016 晚間新聞 楊家駿直播睇手機

然而,如果我在一个Windows批处理文件中使用相同的命令,并使用FOR循环,那么非ASCII字符将被完全删除。批处理文件代码如下:

@ECHO OFF
FOR /F "delims=" %%i IN ('youtube-dl -e "https://www.youtube.com/watch?v=E_JXrNAxGzM"') DO (
ECHO %%i
)
PAUSE
EXIT

只返回这个结果:2016年12月27日

作为一个测试,我尝试了这样:

set var=晚間新聞楊家駿直播睇手機

for %%i in (%var%) do (
echo %%i
)

这个工具可以正常工作,中文字符也能正确打印出来,这让我觉得这不是CMD的Unicode问题,而是与youtube-dl有关。

然而,有人向我保证这不是youtube-dl的问题

是否我漏掉了什么重要的东西?有没有方法让它能够正常工作?


抱歉,我的错。你尝试过其他的代码页吗? - Nico Nekoru
没有,我认为65001是一个万能的方法。但我不能完全确定它是一个Unicode问题,非ASCII字符从我的观察中被完全移除,甚至连问号或豆腐框都没有。 - crackerbear
呃...这很奇怪。当我在命令提示符中使用日语时,会出现问号框,但我从未见过字符只是被删除并变成空白。 - Nico Nekoru
我的CMD能够显示非ASCII字符,所以我真的不明白为什么使用变量会剥离它们。这里是这些行的比较。 - crackerbear
如果您使用set var=あ或任何其他非罗马化字符,那么echo %var%会显示什么? - Nico Nekoru
显示剩余5条评论
2个回答

6

--encoding utf-8开关似乎在这里与chcp 65001搭配使用正常(免责声明:仅在Win10 v1909下,使用非遗留控制台和NSimSun字体测试通过,其他版本或设置可能会有所不同)。

C:\etc>chcp 65001
Active code page: 65001

C:\etc>for /f "delims=" %i in ('youtube-dl --encoding utf-8 -e "https://www.youtube.com/watch?v=E_JXrNAxGzM"') do @echo %i
27/12/2016 晚間新聞 楊家駿直播睇手機

然而,我已经确信这不是一个youtube-dl的问题。

真正需要问开发者的问题是 youtube-dl 是否会检测输出流是否被发送到交互式控制台进行显示,或者被管道或重定向了,并且是否会根据该检测更改输出编码。我认为答案可能是肯定的,这可以解释直接控制台输出和使用 for循环的差异。


1
--encoding utf-8 对我来说已经足够让它正常工作了。非常感谢,我对此感到困惑。同时也要感谢之前帮助过我的 Neko Musume! - crackerbear

2

正如dxiv所说,youtube-dl可以检测输出和输入编码。

尝试使用-v运行,你将在输出行中看到类似以下内容的信息: [debug] Encodings: locale cp1255, fs mbcs, out cp1255, pref cp1255

我注意到在我的希伯来语系统上,我得到了以下行:

[debug] Encodings: locale cp1255, fs mbcs, out cp862, pref cp1255

对于youtube-dl -e "https://www.youtube.com/watch?v=rplmnAxs3aM" -v命令:

相比之下:

[debug] Encodings: locale cp1255, fs mbcs, out cp1255, pref cp1255

对于 FOR /F "delims=" %i IN ('youtube-dl -e "https://www.youtube.com/watch?v=rplmnAxs3aM" -v') DO ( ECHO %i ),请注意现代希伯来语的代码页为1255,但我的系统上的 cmd.exe 默认为旧的希伯来语代码页862。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接