diff --git a/LunaTranslator/LunaTranslator/myutils/post.py b/LunaTranslator/LunaTranslator/myutils/post.py index 523aa8f2..6a079b92 100644 --- a/LunaTranslator/LunaTranslator/myutils/post.py +++ b/LunaTranslator/LunaTranslator/myutils/post.py @@ -275,7 +275,7 @@ def _remove_symbo(line): (_ord >= 0x21 and _ord <= 0x2F) or (_ord >= 0x3A and _ord <= 0x40) or (_ord >= 0x5B and _ord <= 0x60) - or (_ord >= 0x7B and _ord <= 0x80) + or (_ord >= 0x7B and _ord <= 0x7E) ): continue newline += r @@ -286,7 +286,7 @@ def _remove_control(line): newline = "" for r in line: _ord = ord(r) - if _ord < 0x20 or (_ord > 0x80 and _ord < 0xA0): + if _ord <= 0x1F or (_ord >= 0x7F and _ord < 0xA0): continue newline += r return newline diff --git a/docs/zh/sidebar.md b/docs/zh/sidebar.md index 4d9fdd4a..2ba468ea 100644 --- a/docs/zh/sidebar.md +++ b/docs/zh/sidebar.md @@ -5,7 +5,7 @@ - [支持作者](/zh/support.md) **常见问题** - +- [各种文本处理方法的作用和用法](zh/textprocess.md) - [如何使用大模型离线翻译](/zh/offlinellm.md) - [如何使用内嵌翻译](/zh/embedtranslate.md) - [如何改善OCR模式体验](/zh/gooduseocr.md) diff --git a/docs/zh/textprocess.md b/docs/zh/textprocess.md new file mode 100644 index 00000000..c7b8bf07 --- /dev/null +++ b/docs/zh/textprocess.md @@ -0,0 +1,125 @@ +## 各种文本处理方法的作用和用法 + +>一般在Hook模式下,有时会读取到错误的文本,例如有重复的文本,或者其他乱七八糟的文本,这时需要使用文本处理来解决 + +>如果有非常复杂的错误形式,可以通过激活多种处理方式,并调整他们的执行顺序来得到丰富的处理方法组合 + +**1. 过滤文本中的非日语字符集字符** + +有时,会hook到一些乱码文本。由于一般是日语游戏会出现这个问题,因此预设了这个方法,来过滤掉**无法使用shift-jis字符集编码的字符**,例如: + +`エマさんԟのイԠラストは全部大好き!` 会被处理成 `エマさんのイラストは全部大好き!` + +**2.过滤控制字符** + +这个方法会过滤掉文本中的ascii码控制符,例如``等 + + +**3.过滤英文标点** + +这个方法会过滤掉文本中```!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~``` + + +**4.过滤其他乱码** + +这个需要在设置中,设置允许通过的字符编码,或Unicode范围。不被允许的字符将均被过滤 + +**5.过滤「」以外的字符** + +例如:`こなみ「ひとめぼれってやつだよね……」` 将被处理为 `「ひとめぼれってやつだよね……」` + +**6.去除花括号{}** + +这个和字面意思不太一样,其实主要是用来过滤日语注音的,许多游戏脚本使用{}和一些其他字符来给汉字加注音。支持两种注音格式:`{汉字/注音}`和`{汉字:注音}`,例如: + +`「{恵麻/えま}さん、まだ{起き/おき}てる?」` 或 `「{恵麻:えま}さん、まだ{起き:おき}てる?」` 将被处理成 `「恵麻さん、まだ起きてる?」` + +**7.过滤指定字数的文本** + +这个方法会根据当前文本的字数来决定如何处理。 + +如果文本长度小于最小字数,文本将被过滤。例如某些游戏在静态下会不停的刷新单个倒三角字符,可以用这个来过滤。 + +如果文本长度超过最大字数,如果激活了**超过时截断而非过滤**,则会将截取指定字数的文本;若未激活则文本将被完全过滤。 + +**8.过滤指定行数的文本** + +这个和上面的类似,只不过是根据文本行数来判定。例如可以用来截取文本的前3行。 + + +**9.去除重复字符_AAAABBBBCCCC->ABC** + +这个是最常用的过滤器。 + +由于游戏的文字有时会绘制一遍文字在绘制一遍阴影再绘制一遍描边等之类的原因,Hook模式会多次提取到被重复绘制的字符。例如`恵恵恵麻麻麻さささんんんははは再再再びびび液液液タタタブブブへへへ視視視線線線ををを落落落とととすすす。。。`,这个方法会将他处理成`恵麻さんは再び液タブへ視線を落とす。`。默认的重复次数是`1`会自动分析重复的字数,但也有分析的不准确的情况,建议指定一个确定的重复字数。 + +**10.过滤历史重复LRU** + +有时,游戏重复绘制的方式不是逐个字符的,而是逐行一起绘制,而且同时很变态的是会在静态的情况下不停的重新绘制当前显示的文本。例如假设当前显示的是两行文本`你好`和`哈哈`,如果不使用这个方法,将会反复输出`你好哈哈你好哈哈你好哈哈你好哈哈……`。使用这个方法,缓存若干条近期输出过的文本,当有缓存满时且出现新的文本时,剔除掉缓存中最早的那条文本,从而使近期的文本不会反复刷新。 + +**11.去除重复行_ABCDABCDABCD->ABCD** + +这个也比较常见,和上面的类似,只不过一般不会反复刷新,而是快速的一次刷新多次。效果为 `恵麻さんは再び液タブへ視線を落とす。恵麻さんは再び液タブへ視線を落とす。恵麻さんは再び液タブへ視線を落とす。` 会变成`恵麻さんは再び液タブへ視線を落とす。`。同样,默认的重复次数是`1`会自动分析重复的字数,但也有分析的不准确的情况,建议指定一个确定的重复字数。 + +**12.去除重复行_S1S1S1S2S2S2->S1S2** + +这个相对比较复杂,有时每个句子的刷新次数是不完全一样的,这时只能完全由程序分析来决定如何去重。例如`恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。なんてニヤニヤしていると、恵麻さんが振り返った。私は恵麻さんの目元を優しくハンカチで拭う。私は恵麻さんの目元を優しくハンカチで拭う。`, 其中`恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。`重复了3次,`なんてニヤニヤしていると、恵麻さんが振り返った。`没有重复,`私は恵麻さんの目元を優しくハンカチで拭う。`重复了2次,最终经过分析将得到`恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。なんてニヤしていると、恵麻さんが振り返った。私は恵麻さんの目元を優しくハンカチで拭う。`,其中因为过于复杂,会存在少许的分析错误,这也是无法避免的,但一般都能基本正确的得到结果。 + +**13.过滤尖括号<>** + +这个实际上是过滤HTML标签,怕小白不知道是什么意思所以这么写的名字。例如`
`和`
`和`
`等都会被过滤。这个主要用在TyranoScript游戏中,HOOK提取的文本是innerHTML,一般都会带有许多这个标签。 + +**14.过滤换行符** + +略 + +**15.过滤换行符 语言自适应** + +这个主要针对英文游戏。如果源语言不是日语,那么当过滤换行符时,将会把换行符替换成空格而非过滤掉,来避免多个单词连到一起。 + +**16.过滤数字** + +略 + +**17.过滤英文字母** + +略 + +**18.简单字符串替换** + +不止是替换,主要也可以用来过滤。可以将固定的若干乱码字符、反复刷新的倒三角字符等通过替换成空白来进行过滤。 + + +**19.转义字符串替换** + +主要是可以支持`\n`来表示换行符,从而实现可以过滤仅在换行符前后出现的字符。 + + +**20.正则表达式替换** + +注:**这个输入的内容都是转义字符串**,也就是说比如你在外面写python代码`re.sub(r"\n","")`来测试再填入,想把`\n`这两个字符替换掉,实际上这里会替换掉**换行符**,你想在外面测试的话请用`re.sub("\\n","")`这样来测试 + +**21.去除重复行_ABCDBCDCDD->ABCD** + +这个也比较常见。这个出现的原因是,有时HOOK的某个显示文本的函数,其参数是显示的文本,这个函数会再每显示一个字符时都会调用,且每次会把参数的字符串指向下一个字符,从而导致其实第一次调用其实就已经得到完整的文本了,后续每次又输出了剩下的子串,直到长度递减为0。例如`恵麻さんは再び液タブへ視線を落とす。麻さんは再び液タブへ視線を落とす。さんは再び液タブへ視線を落とす。んは再び液タブへ視線を落とす。は再び液タブへ視線を落とす。再び液タブへ +視線を落とす。び液タブへ視線を落とす。液タブへ視線を落とす。タブへ視線を落とす。ブへ視線を落とす。へ視線を落とす。視線を落とす。線を落とす。を落とす。落とす。とす。す。。` 经过分析将判断真实的文本应该是`恵麻さんは再び液タブへ視線を落とす。` + + +**22.去除重复行_AABABCABCD->ABCD** + +这个也比较常见,出现的原因是,每次绘制一个字符,然后绘制下一个字符时都会把前面的字符都再绘制一遍。例如`恵麻恵麻さ恵麻さん恵麻さんは恵麻さんは再恵麻さんは再び恵麻さんは再び液恵麻さんは再び液タ恵麻さんは再び液タブ恵麻さんは再び液タブへ恵麻さんは再び液タブへ視恵麻さんは再び液 +タブへ視線恵麻さんは再び液タブへ視線を恵麻さんは再び液タブへ視線を落恵麻さんは再び液タブへ視線を落と恵麻さんは再び液タブへ視線を落とす恵麻さんは再び液タブへ視線を落とす。`经过分析将判断真实的文本应该是`恵麻さんは再び液タブへ視線を落とす。` + +**23.去除重复行_AABABCABCDEEFEFG->ABCDEFG** + +这个和上面的类似,只不过当有多行文本时,会每行单独按照上面的逻辑来重复,从而带来了更多的复杂性。由于过于复杂,这个处理经常难以正确处理,如果遇到了,建议写自定义python处理来解决 + +**24.自定义python处理** + +撰写一个python脚本来进行更加复杂的处理,当处理脚本不存在时,将自动在userconfig目录下生成`mypost.py`文件和以下模板: + +``` +def POSTSOLVE(line): + # 请在这里编写自定义处理 + return line +``` \ No newline at end of file