在 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,这是旧的希伯来语代码页。
运行 直接在 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,这是旧的希伯来语代码页。