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

124 lines
No EOL
10 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}
가끔씩 후킹된 텍스트에 일부 깨진 문자가 포함될 수 있습니다. 일반적으로 일본어 게임에서 이 문제가 발생하므로, **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. #### 사용자 정의 파이썬 처리 {#anchor-_11}
더 복잡한 처리를 위해 Python 스크립트를 작성합니다. 처리 스크립트가 존재하지 않을 경우, userconfig 디렉토리에 자동으로 `mypost.py` 파일과 다음 템플릿이 생성됩니다:
```python
def POSTSOLVE(line):
# 여기에 사용자 정의 처리를 작성하세요
return line
```
1. #### 문자열 대체 {#anchor-stringreplace}
치환뿐만 아니라 주로 필터링에도 사용됩니다. 예를 들어 일정한 이상한 문자들, 반복적으로 갱신되는 역삼각형 문자 등을 공백으로 치환하여 필터링할 수 있습니다.
`정규식`과 `이스케이프` 두 옵션을 동시에 활성화하거나, 둘 중 하나만 선택하거나, 모두 활성화하지 않을 수 있습니다.
모두 활성화하지 않을 경우 일반 문자열 치환이 사용됩니다.
`이스케이프`를 활성화하면 입력 내용이 문자열 리터럴이 아닌 이스케이프 문자열로 처리됩니다. 예를 들어 `\n`을 사용하여 개행 문자를 나타낼 수 있으며, 이를 통해 개행 문자 전후에만 나타나는 문자 등을 필터링할 수 있습니다.
`정규식`을 활성화하면 정규 표현식 치환이 사용됩니다.