LunaTranslator/docs/zh/textprocess.md
HIllya51 f3f0adb85b .
2025-08-24 21:18:13 +08:00

124 lines
No EOL
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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