LuckyPuppy514 / Play-With-MPV

使用 MPV 播放网页中的视频
MIT License
570 stars 19 forks source link

少部分视频标题乱码 #118

Closed verygoodlee closed 11 months ago

verygoodlee commented 11 months ago

碰到过挺多次了,有些标题的结尾部分乱码了 例如:2023年运动相机的王座,它还能守住吗?GoPro HERO12上手体验_哔哩哔哩_bilibili image

可以排除播放器的原因,使用wmic process where name="mpv.exe" get commandline命令查看mpv调用的完整命令行,--force-media-title确实乱码了 image

应该是这部分对于长标题的截取出了问题,encodeURIComponent()会把中文字符编码为UTF8编码的转义序列,后面再去substring()可能会把中文字符截断造成乱码,\ 应该先substring()encodeURIComponent(),此时maxLength的值需要调小,感觉写死在40左右就挺合适的 https://github.com/LuckyPuppy514/Play-With-MPV/blob/7cc28426f65cc544efb1ccc620462a1e9dc91f7a/play-with-mpv.user.js#L1778-L1782

LuckyPuppy514 commented 11 months ago

暂时先这样吧,不影响观看,你说的方案可行,但是直接把改小,URL编码前后一样的标题又会变得很短(单其实可以支持比较长的标题),而且这长度是限制所有参数加起来的长度,40个中文在B站也是太多,传不过去的(因为B站的链接很长,还有音频)

verygoodlee commented 11 months ago

暂时先这样吧,不影响观看,你说的方案可行,但是直接把改小,URL编码前后一样的标题又会变得很短(单其实可以支持比较长的标题),而且这长度是限制所有参数加起来的长度,40个中文在B站也是太多,传不过去的(因为B站的链接很长,还有音频)

有新方案了,在substring()之后再处理一下,剔除掉乱码字符,\ 利用decodeURIComponent()解码时碰到异常字符会报错的特性

if (title.length > maxLength) {
    title = title.substring(0, maxLength);
    // 为防止尾部中文字符转义序列被截断造成乱码,尝试解码
    for (; ; ) {
        try {
            decodeURIComponent(title);
            break;
        } catch (e) {
            // UTF-8编码单字符最多占用4字节,转义序列最多4个%,
            // 最多循环4次可剔除尾部异常部分
            title = title.substring(0, title.lastIndexOf("%"));
        }
    }
    title = title + "...";
}