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

112 lines
No EOL
11 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モードでは、誤ったテキストが読み取られることがあります。例えば、重複したテキストや他の乱れたテキストです。このような場合、テキスト処理が必要です。
:::
::: info
非常に複雑なエラー形式がある場合、複数の処理方法を有効にし、その実行順序を調して、豊富な処理方法の組み合わせを得ることができます。
:::
::: 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モードで読み取ったテキストにのみ有効です
:::
これも一般的です。この原因は、テキストを表示する関数に表示されるテキストがパラメータとして渡され、各文字が表示されるたびに関数が呼び出され、各回でパラメータ文字列が次の文字を指すように変更されるためです。結果として、最初の呼び出しで完全なテキストが取得され、後続の呼び出しで残りの部分文字列が出力され、長さが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`を使用して改行文字を表すことができ、改行文字の前後にのみ表示される文字をフィルタリングできます。
`正規表現`を有効にすると、正規表現置換が使用されます。