DYY-Studio / AddSubFontMKV_py

将您的字幕和字体通过mkvmerge/ffmpeg快速批量封装到Matroska容器,适用于Windows系统,仅py3.7+
Apache License 2.0
32 stars 1 forks source link

怎么解决? #34

Open tb114514 opened 6 months ago

tb114514 commented 6 months ago

UnicodeEncodeError: 'gbk' codec can't encode character '\ue4c6' in position 0: illegal multibyte sequence

DYY-Studio commented 5 months ago

请提供一下使用的文件并叙述一下发生时的操作过程,谢谢。 请把报错信息进行完整复制以便确认。

这样我不好确定是哪个部分的文本编码问题。

DYY-Studio commented 5 months ago

根据Unicode组织的映射表,U+E4C6属于一个Private Use Area,即用户自定义区GBK编码标准中并没有定义这样的用户区。您是使用了一些有特殊字符映射的字体吗?

GB18030标准中提供了与Unicode对应的用户区域。 如果确认您的问题是由这个导致,以后这部分会全部改为GB18030解码。

image

tb114514 commented 5 months ago

请在此工具旁叙述一下当发生这种情况时,谢谢。 请复制错误信息以便确认。

👉我不好意思打扰你们,这是部分文本编码问题。

这是整个过程: 正在尝试从字幕所在文件夹载入字体... 目录下没有字体

正在分析字幕: "27.ass" [WARNING] 字体"创艺简中圆"可能不能正常子集化 字幕所需字体 "创艺简中圆": 字符数[924] "方正综艺简体": 字符数[82] "DFGKanTeiRyu-XB": 字符数[20] "方正准圆_GBK": 字符数[15] 字体输出路径: "D:\Desktop\银魂\Fonts\27" [1/4] 正在子集化…… [Warning] 正在使用地区编码"gbk"读取CMAP映射表

Traceback (most recent call last): File "D:\game\MKVToolNix\ASFMKV_py1.02-pre12E.py", line 3077, in loadMain() File "D:\game\MKVToolNix\ASFMKV_py1.02-pre12E.py", line 2996, in loadMain cFontSubset(font_info) File "D:\game\MKVToolNix\ASFMKV_py1.02-pre12E.py", line 2639, in cFontSubset newasspaths, newfont_name, mkvr = main(font_info2, media_ass[k], File "D:\game\MKVToolNix\ASFMKV_py1.02-pre12E.py", line 2131, in main newfont_name = assFontSubset(assfont, fo, font_info) File "D:\game\MKVToolNix\ASFMKV_py1.02-pre12E.py", line 1337, in assFontSubset gfs, gfs_uni, out_of_range = charExistCheck(s[0], s[1], s[2]) File "D:\game\MKVToolNix\ASFMKV_py1.02-pre12E.py", line 1273, in charExistCheck dec = int(''.join([hex(h).lstrip('0x') for h in c.encode(tcoding)]), 16) UnicodeEncodeError: 'gbk' codec can't encode character '\ue4c6' in position 0: illegal multibyte sequence 这是字幕文件:(原文件为ass格式github不让传) 27.txt

tb114514 commented 5 months ago

请提供一下使用的文件并叙述一下发生时的操作过程,谢谢。 请把报错信息进行完整复制以便确认。

这样我不好确定是哪个部分的文本编码问题。

过程是:打开脚本选择"[B] 字体子集化 & MKV封装"-"[B] 子集化并封装"然后输入文件位置回车报错

DYY-Studio commented 5 months ago

好的,已检查这一步中出错时的字体创艺简中圆 首先它的CMAP表标识为GBK而非标准的UnicodeGBK字符集并没有U+E4C6对应的用户自定义区

其次,通过FontCreator检查,创艺简中圆中也没有定义U+E4C6

这意味着这一步的出错极有可能是您字幕文本的问题。

请您重新确认您的字幕是否有文本问题, 已经确认发生问题的字符位于字幕0:00:52.22,0:00:56.12

关于这一点神乐你倒是有一辈子都是吊儿郎当的面相啊

关于这一点神乐你倒是有一辈子都是吊儿郎当的面相啊中间夹着字符U+E4C6

这个字符您真的需要吗?是否是输入或者拷贝错误导致了该字符的出现?

tb114514 commented 5 months ago

好的,已检查这一步中出错时的字体创艺简中圆 首先它的CMAP表标识为GBK而非标准的UnicodeGBK字符集并没有U+E4C6对应的用户自定义区

其次,通过FontCreator检查,创艺简中圆中也没有定义U+E4C6

这意味着这一步的出错极有可能是您字幕文本的问题。

请您重新确认您的字幕是否有文本问题, 已经确认发生问题的字符位于字幕0:00:52.22,0:00:56.12

关于这一点神乐你倒是有一辈子都是吊儿郎当的面相啊

关于这一点神乐你倒是有一辈子都是吊儿郎当的面相啊中间夹着字符U+E4C6

这个字符您真的需要吗?是否是输入或者拷贝错误导致了该字符的出现?

倒是不需要,你可以告诉我找出这种违规字符的方法吗?

DYY-Studio commented 5 months ago

最简单的就是用可以将这些非标准Unicode字符显示为一个框框或者问号的查看器,进行人工检查 如:Windows记事本(我用的是Win11)、VS Code、甚至放到浏览器里等进行一遍浏览,人工检查一下。

由于这种字符显示得比较明显,应该还是很容易发现的。 似乎Aegisub会自动忽略这种字符?我导入没看见。

比较复杂的是使用正则表达式等对这些区域进行搜索

就这次的问题来说,您可以使用 [\uE000-\uF8FF] 进行正则表达式搜索

E000~F8FF就是这次字符所在的用户自定义区,一个一般不会设置字符的区域

您还可以根据报错信息 encode character '\ue4c6',转写为正则表达式[\ue4c6]进行搜索

tb114514 commented 5 months ago

好的感谢

DYY-Studio commented 5 months ago

U+E4C6是不是被你们当成大空格用了x 换成U+3000(日语全角空格) 或者U+0020(一般半角空格) 就行