gwy15 / danmu2ass

将哔哩哔哩的 弹幕 转化为 ass 字幕文件,实时预览
MIT License
120 stars 8 forks source link

弹幕中带有回车符时会生成错误的ass内容 #2

Closed kafuumi closed 2 years ago

kafuumi commented 2 years ago

环境说明

问题描述

如果一条弹幕中间部分带有回车符,在转换成ass文件后,导致回车符后面的字符另起一行,从而导致这部分内容不会被当成字幕内容。

例如,原始的xml数据为:

<d p="1.085,1,25,5566168,1649656743447,0,xxxx,0" user="xxxx">呵
呵
比
你
们
更
喜
欢
晚
晚</d>

转换后对应的ass内容为:

Dialogue: 2,0:00:01.08,0:00:16.09,Float,,0,0,0,,{\move(1280, 224, -660, 224)\c&Hd8ee54&}呵
呵
比
你
们
更
喜
欢
晚
晚

这样的字幕内容会导致最终的渲染只有内容 ,而 呵比你们更喜欢晚晚 因为格式问题被当作错误数据而不被渲染。

解决方案

在ass格式中,如果要实现换行效果需要显式地使用\N来代替不可见的回车符(参见:aegisub手册)。

也就是说,如果要正确显示上面提到的内容,对应的ass内容应该为:

Dialogue: 2,0:00:01.08,0:00:16.09,Float,,0,0,0,,{\move(1280, 224, -660, 224)\c&Hd8ee54&}呵\N呵\N比\N你\N们\N更\N喜\N欢\N晚\N晚

所以在生成ass文件时需要进行一次字符替换,将\n替换为\N

gwy15 commented 2 years ago

确认是bug,修复一下

kafuumi commented 2 years ago

额外补充一点:有些弹幕的首尾部分也会存在回车,对这部分弹幕如果直接将回车换成\N有可能会影响最终的排布效果,建议在替换前先去除掉弹幕内容首尾部分的回车。

gwy15 commented 2 years ago

close via 63331d52ffbbd00ae9f43db6c4c921eafe025cef