## 各种文本处理方法的作用和用法 >一般在Hook模式下,有时会读取到错误的文本,例如有重复的文本,或者其他乱七八糟的文本,这时需要使用文本处理来解决 >如果有非常复杂的错误形式,可以通过激活多种处理方式,并调整他们的执行顺序来得到丰富的处理方法组合 1. #### 过滤文本中的非日语字符集字符 有时,会hook到一些乱码文本。由于一般是日语游戏会出现这个问题,因此预设了这个方法,来过滤掉**无法使用shift-jis字符集编码的字符**,例如: `エマさんԟのイԠラストは全部大好き!` 会被处理成 `エマさんのイラストは全部大好き!` 1. #### 过滤控制字符 这个方法会过滤掉文本中的ascii码控制符,例如``等 1. #### 过滤英文标点 这个方法会过滤掉文本中```!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~``` 1. #### 过滤其他乱码 这个需要在设置中,设置允许通过的字符编码,或Unicode范围。不被允许的字符将均被过滤 1. #### 过滤「」以外的字符 例如:`こなみ「ひとめぼれってやつだよね……」` 将被处理为 `「ひとめぼれってやつだよね……」` 1. #### 去除花括号{} 这个和字面意思不太一样,其实主要是用来过滤日语注音的,许多游戏脚本使用{}和一些其他字符来给汉字加注音。支持两种注音格式:`{汉字/注音}`和`{汉字:注音}`,例如: `「{恵麻/えま}さん、まだ{起き/おき}てる?」` 或 `「{恵麻:えま}さん、まだ{起き:おき}てる?」` 将被处理成 `「恵麻さん、まだ起きてる?」` 1. #### 按字数过滤或截断 这个方法会根据当前文本的字数来决定如何处理。 如果文本长度小于最小字数,文本将被过滤。例如某些游戏在静态下会不停的刷新单个倒三角字符,可以用这个来过滤。 如果文本长度超过最大字数,如果激活了**超过最大字数时截断而非过滤**,则会将截取指定字数的文本;若未激活则文本将被完全过滤。 如果激活了**截断时反向截断**,则当截断时,会保留后`最大字数`个字,否则则会保留前`最大字数`个字。 1. #### 按行数过滤或截断 这个和上面的类似,只不过是根据文本行数来判定。主要可以用来截取文本的前三行或者截取文本的最后一行,或者过滤行数过多过少的行。 如果文本行数小于最小行数,文本将被过滤。 如果文本行数超过最大行数,如果激活了**超过最大行数时截断而非过滤**,则会将截取指定行数的文本;若未激活则文本将被完全过滤。 如果激活了**截断时反向截断**,则当截断时,会保留后`最大行数`个行,否则则会保留前`最大行数`个行。 1. #### 去除重复字符_AAAABBBBCCCC->ABC 这个是最常用的过滤器。 由于游戏的文字有时会绘制一遍文字在绘制一遍阴影再绘制一遍描边等之类的原因,Hook模式会多次提取到被重复绘制的字符。例如`恵恵恵麻麻麻さささんんんははは再再再びびび液液液タタタブブブへへへ視視視線線線ををを落落落とととすすす。。。`,这个方法会将他处理成`恵麻さんは再び液タブへ視線を落とす。`。默认的重复次数是`1`会自动分析重复的字数,但也有分析的不准确的情况,建议指定一个确定的重复字数。 1. #### 过滤历史重复LRU 有时,游戏重复绘制的方式不是逐个字符的,而是逐行一起绘制,而且同时很变态的是会在静态的情况下不停的重新绘制当前显示的文本。例如假设当前显示的是两行文本`你好`和`哈哈`,如果不使用这个方法,将会反复输出`你好哈哈你好哈哈你好哈哈你好哈哈……`。使用这个方法,缓存若干条近期输出过的文本,当有缓存满时且出现新的文本时,剔除掉缓存中最早的那条文本,从而使近期的文本不会反复刷新。 1. #### 去除重复行_ABCDABCDABCD->ABCD 这个也比较常见,和上面的类似,只不过一般不会反复刷新,而是快速的一次刷新多次。效果为 `恵麻さんは再び液タブへ視線を落とす。恵麻さんは再び液タブへ視線を落とす。恵麻さんは再び液タブへ視線を落とす。` 会变成`恵麻さんは再び液タブへ視線を落とす。`。同样,默认的重复次数是`1`会自动分析重复的字数,但也有分析的不准确的情况,建议指定一个确定的重复字数。 1. #### 去除重复行_S1S1S1S2S2S2->S1S2 这个相对比较复杂,有时每个句子的刷新次数是不完全一样的,这时只能完全由程序分析来决定如何去重。例如`恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。なんてニヤニヤしていると、恵麻さんが振り返った。私は恵麻さんの目元を優しくハンカチで拭う。私は恵麻さんの目元を優しくハンカチで拭う。`, 其中`恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。`重复了3次,`なんてニヤニヤしていると、恵麻さんが振り返った。`没有重复,`私は恵麻さんの目元を優しくハンカチで拭う。`重复了2次,最终经过分析将得到`恵麻さん……ううん、恵麻ははにかむように私の名前を呼ぶ。なんてニヤしていると、恵麻さんが振り返った。私は恵麻さんの目元を優しくハンカチで拭う。`,其中因为过于复杂,会存在少许的分析错误,这也是无法避免的,但一般都能基本正确的得到结果。 1. #### 过滤尖括号<> 这个实际上是过滤HTML标签,怕小白不知道是什么意思所以这么写的名字。例如`
`和`
`和`
`等都会被过滤。这个主要用在TyranoScript游戏中,HOOK提取的文本是innerHTML,一般都会带有许多这个标签。 1. #### 过滤换行符 原名为**过滤换行符 语言自适应**,旧版**过滤换行符**已被废弃。 如果源语言不是日语,那么当过滤换行符时,将会把换行符替换成空格而非过滤掉,来避免多个单词连到一起。 1. #### 过滤数字 略 1. #### 过滤英文字母 略 1. #### 去除重复行_ABCDBCDCDD->ABCD 这个也比较常见。这个出现的原因是,有时HOOK的某个显示文本的函数,其参数是显示的文本,这个函数会再每显示一个字符时都会调用,且每次会把参数的字符串指向下一个字符,从而导致其实第一次调用其实就已经得到完整的文本了,后续每次又输出了剩下的子串,直到长度递减为0。例如`恵麻さんは再び液タブへ視線を落とす。麻さんは再び液タブへ視線を落とす。さんは再び液タブへ視線を落とす。んは再び液タブへ視線を落とす。は再び液タブへ視線を落とす。再び液タブへ視線を落とす。び液タブへ視線を落とす。液タブへ視線を落とす。タブへ視線を落とす。ブへ視線を落とす。へ視線を落とす。視線を落とす。線を落とす。を落とす。落とす。とす。す。。` 经过分析将判断真实的文本应该是`恵麻さんは再び液タブへ視線を落とす。` 1. #### 去除重复行_AABABCABCD->ABCD 这个也比较常见,出现的原因是,每次绘制一个字符,然后绘制下一个字符时都会把前面的字符都再绘制一遍。例如`恵麻恵麻さ恵麻さん恵麻さんは恵麻さんは再恵麻さんは再び恵麻さんは再び液恵麻さんは再び液タ恵麻さんは再び液タブ恵麻さんは再び液タブへ恵麻さんは再び液タブへ視恵麻さんは再び液タブへ視線恵麻さんは再び液タブへ視線を恵麻さんは再び液タブへ視線を落恵麻さんは再び液タブへ視線を落と恵麻さんは再び液タブへ視線を落とす恵麻さんは再び液タブへ視線を落とす。`经过分析将判断真实的文本应该是`恵麻さんは再び液タブへ視線を落とす。` 1. #### 去除重复行_AABABCABCDEEFEFG->ABCDEFG 这个和上面的类似,只不过当有多行文本时,会每行单独按照上面的逻辑来重复,从而带来了更多的复杂性。由于过于复杂,这个处理经常难以正确处理,如果遇到了,建议写自定义python处理来解决 1. #### 自定义python处理 撰写一个python脚本来进行更加复杂的处理,当处理脚本不存在时,将自动在userconfig目录下生成`mypost.py`文件和以下模板: ``` def POSTSOLVE(line): # 请在这里编写自定义处理 return line ``` 1. #### 字符串替换 不止是替换,主要也可以用来过滤。例如可以将固定的若干乱码字符、反复刷新的倒三角字符等通过替换成空白来进行过滤。 可同时激活`正则`和`转义`两个选项,或仅选择其中一个,或均不激活。 均不激活时,将使用普通的字符串替换。 激活`转义`后,输入的内容都会被视为转义字符串,而非字符串字面量。例如可以使用`\n`来表示换行符,从而实现可以过滤仅在换行符前后出现的字符等。 激活`正则`后,将使用正则表达式替换。