LunaTranslator/docs/zh/textprocess.md
test123456654321 50d2550511 docs
2024-10-28 12:51:25 +08:00

9.6 KiB
Raw Blame History

各种文本处理方法的作用和用法

一般在Hook模式下有时会读取到错误的文本例如有重复的文本或者其他乱七八糟的文本这时需要使用文本处理来解决

如果有非常复杂的错误形式,可以通过激活多种处理方式,并调整他们的执行顺序来得到丰富的处理方法组合

  1. 过滤文本中的非日语字符集字符

    有时会hook到一些乱码文本。由于一般是日语游戏会出现这个问题因此预设了这个方法来过滤掉无法使用shift-jis字符集编码的字符,例如:

    エマさんԟのイԠラストは全部大好き! 会被处理成 エマさんのイラストは全部大好き!

  2. 过滤控制字符

    这个方法会过滤掉文本中的ascii码控制符例如

  3. 过滤英文标点

    这个方法会过滤掉文本中!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

  4. 过滤其他乱码

    这个需要在设置中设置允许通过的字符编码或Unicode范围。不被允许的字符将均被过滤

  5. 过滤「」以外的字符

    例如:こなみ「ひとめぼれってやつだよね……」 将被处理为 「ひとめぼれってやつだよね……」

  6. 去除花括号

    这个和字面意思不太一样,其实主要是用来过滤日语注音的,许多游戏脚本使用{}和一些其他字符来给汉字加注音。支持两种注音格式:{汉字/注音}{汉字:注音},例如:

    「{恵麻/えま}さん、まだ{起き/おき}てる?」「{恵麻:えま}さん、まだ{起き:おき}てる?」 将被处理成 「恵麻さん、まだ起きてる?」

  7. 按字数过滤或截断

    这个方法会根据当前文本的字数来决定如何处理。

    如果文本长度小于最小字数,文本将被过滤。例如某些游戏在静态下会不停的刷新单个倒三角字符,可以用这个来过滤。

    如果文本长度超过最大字数,如果激活了超过最大字数时截断而非过滤,则会将截取指定字数的文本;若未激活则文本将被完全过滤。

    如果激活了截断时反向截断,则当截断时,会保留后最大字数个字,否则则会保留前最大字数个字。

  8. 按行数过滤或截断

    这个和上面的类似,只不过是根据文本行数来判定。主要可以用来截取文本的前三行或者截取文本的最后一行,或者过滤行数过多过少的行。

    如果文本行数小于最小行数,文本将被过滤。

    如果文本行数超过最大行数,如果激活了超过最大行数时截断而非过滤,则会将截取指定行数的文本;若未激活则文本将被完全过滤。

    如果激活了截断时反向截断,则当截断时,会保留后最大行数个行,否则则会保留前最大行数个行。

  9. 去除重复字符_AAAABBBBCCCC->ABC

    这个是最常用的过滤器。

    由于游戏的文字有时会绘制一遍文字在绘制一遍阴影再绘制一遍描边等之类的原因Hook模式会多次提取到被重复绘制的字符。例如恵恵恵麻麻麻さささんんんははは再再再びびび液液液タタタブブブへへへ視視視線線線ををを落落落とととすすす。。。,这个方法会将他处理成恵麻さんは再び液タブへ視線を落とす。。默认的重复次数是1会自动分析重复的字数,但也有分析的不准确的情况,建议指定一个确定的重复字数。

  10. 过滤历史重复LRU

    有时,游戏重复绘制的方式不是逐个字符的,而是逐行一起绘制,而且同时很变态的是会在静态的情况下不停的重新绘制当前显示的文本。例如假设当前显示的是两行文本你好哈哈,如果不使用这个方法,将会反复输出你好哈哈你好哈哈你好哈哈你好哈哈……。使用这个方法,缓存若干条近期输出过的文本,当有缓存满时且出现新的文本时,剔除掉缓存中最早的那条文本,从而使近期的文本不会反复刷新。

  11. 去除重复行_ABCDABCDABCD->ABCD

    这个也比较常见,和上面的类似,只不过一般不会反复刷新,而是快速的一次刷新多次。效果为 恵麻さんは再び液タブへ視線を落とす。恵麻さんは再び液タブへ視線を落とす。恵麻さんは再び液タブへ視線を落とす。 会变成恵麻さんは再び液タブへ視線を落とす。。同样,默认的重复次数是1会自动分析重复的字数,但也有分析的不准确的情况,建议指定一个确定的重复字数。

  12. 去除重复行_S1S1S1S2S2S2->S1S2

    这个相对比较复杂,有时每个句子的刷新次数是不完全一样的,这时只能完全由程序分析来决定如何去重。例如恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。なんてニヤニヤしていると、恵麻さんが振り返った。私は恵麻さんの目元を優しくハンカチで拭う。私は恵麻さんの目元を優しくハンカチで拭う。 其中恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。重复了3次なんてニヤニヤしていると、恵麻さんが振り返った。没有重复,私は恵麻さんの目元を優しくハンカチで拭う。重复了2次最终经过分析将得到恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。なんてニヤしていると、恵麻さんが振り返った。私は恵麻さんの目元を優しくハンカチで拭う。,其中因为过于复杂,会存在少许的分析错误,这也是无法避免的,但一般都能基本正确的得到结果。

  13. 过滤尖括号<>

    这个实际上是过滤HTML标签怕小白不知道是什么意思所以这么写的名字。例如<div></div><div id="dsds">等都会被过滤。这个主要用在TyranoScript游戏中HOOK提取的文本是innerHTML一般都会带有许多这个标签。

  14. 过滤换行符

    原名为过滤换行符 语言自适应,旧版过滤换行符已被废弃。

    如果源语言不是日语,那么当过滤换行符时,将会把换行符替换成空格而非过滤掉,来避免多个单词连到一起。

  15. 过滤数字

  16. 过滤英文字母

  17. 去除重复行_ABCDBCDCDD->ABCD

    这个也比较常见。这个出现的原因是有时HOOK的某个显示文本的函数其参数是显示的文本这个函数会再每显示一个字符时都会调用且每次会把参数的字符串指向下一个字符从而导致其实第一次调用其实就已经得到完整的文本了后续每次又输出了剩下的子串直到长度递减为0。例如恵麻さんは再び液タブへ視線を落とす。麻さんは再び液タブへ視線を落とす。さんは再び液タブへ視線を落とす。んは再び液タブへ視線を落とす。は再び液タブへ視線を落とす。再び液タブへ視線を落とす。び液タブへ視線を落とす。液タブへ視線を落とす。タブへ視線を落とす。ブへ視線を落とす。へ視線を落とす。視線を落とす。線を落とす。を落とす。落とす。とす。す。。 经过分析将判断真实的文本应该是恵麻さんは再び液タブへ視線を落とす。

  18. 去除重复行_AABABCABCD->ABCD

    这个也比较常见,出现的原因是,每次绘制一个字符,然后绘制下一个字符时都会把前面的字符都再绘制一遍。例如恵麻恵麻さ恵麻さん恵麻さんは恵麻さんは再恵麻さんは再び恵麻さんは再び液恵麻さんは再び液タ恵麻さんは再び液タブ恵麻さんは再び液タブへ恵麻さんは再び液タブへ視恵麻さんは再び液タブへ視線恵麻さんは再び液タブへ視線を恵麻さんは再び液タブへ視線を落恵麻さんは再び液タブへ視線を落と恵麻さんは再び液タブへ視線を落とす恵麻さんは再び液タブへ視線を落とす。经过分析将判断真实的文本应该是恵麻さんは再び液タブへ視線を落とす。

  19. 去除重复行_AABABCABCDEEFEFG->ABCDEFG

    这个和上面的类似只不过当有多行文本时会每行单独按照上面的逻辑来重复从而带来了更多的复杂性。由于过于复杂这个处理经常难以正确处理如果遇到了建议写自定义python处理来解决

  20. 自定义python处理

    撰写一个python脚本来进行更加复杂的处理当处理脚本不存在时将自动在userconfig目录下生成mypost.py文件和以下模板:

    def POSTSOLVE(line):
        # 请在这里编写自定义处理
        return line
    
  21. 字符串替换

    不止是替换,主要也可以用来过滤。例如可以将固定的若干乱码字符、反复刷新的倒三角字符等通过替换成空白来进行过滤。

    可同时激活正则转义两个选项,或仅选择其中一个,或均不激活。

    均不激活时,将使用普通的字符串替换。

    激活转义后,输入的内容都会被视为转义字符串,而非字符串字面量。例如可以使用\n来表示换行符,从而实现可以过滤仅在换行符前后出现的字符等。

    激活正则后,将使用正则表达式替换。