在 Windows CMD FOR 循环中使用 youtube-dl 去除非 ASCII 字符

Using youtube-dl in a Windows CMD FOR loop strips non ASCII characters

运行 直接在 CMD 中使用 youtube-dl 的命令按预期工作:

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

它正确给出了 Youtube 视频的标题:27/12/2016 晚间新闻杨家骏直播剪辑手机

但是,如果我使用 FOR 循环在 Windows 批处理文件中使用相同的命令,非 ASCII 字符将被完全删除。批处理文件代码:

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

只给出这个结果:27/12/2016

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

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

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

工作正常 echos the Chinese characters correctly,这让我相信这不是 CMD 中的 Unicode 问题,而是与 youtube-dl.

有某种联系

不过,我已经确定是not a youtube-dl problem

有什么我遗漏的吗?有什么方法可以让它正常工作?

--encoding utf-8 开关似乎在此处与 chcp 65001 一起工作(免责声明:仅在 win10 v1909 下使用带有 NSimSun 字体的非旧版控制台、带有其他版本或设置的 ymmv 尝试过)。

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 晚間新聞 楊家駿直播睇手機

________

However, I have been assured that it's not a youtube-dl problem.

要问开发者的真正问题是 youtube-dl 是否对发送到交互式控制台的输出流进行任何检测,而不是通过管道或重定向,以及它是否根据该检测更改输出编码.我相信答案可能是肯定的,这可以解释直接控制台输出与 for 循环之间的区别。

正如 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,这是旧的希伯来语代码页。