0

QTextEditユーザーが任意のテキストを挿入できる場所があります。このテキストには、自動翻訳したい特殊な文字列が含まれている可能性があります。そして翻訳版から、シークエンスに戻れたらと思います。

たとえば、次のようにします。

QMessageBox::information(0, "Foo", MAGIC_TRANSLATE(myTextEdit->text()));

ユーザーがmyTextEditのテキスト内にシーケンスを書いた場合、文字列を実際の改行文字に変換し\nたいと思います。MAGIC_TRANSLATE\n

同様に、改行を含むテキストを指定すると、 aMAGIC_UNTRANSLATEは改行を文字列に変換します\n

もちろん、これらの 2 つの関数を自分で実装することもできますが、Qt で既に作成された使いやすいものがあるかどうかを尋ねています。

共通の接頭辞を持つシーケンスは、変換など、いくつかの競合を引き起こす可能性があることに注意してください。

\foo -> FOO
\foobar -> FOOBAR

の前に が検索されて置換された場合、結果のテキストは(より自然な) ではなく になるasd \foobar lolため、テキストを翻訳するときに問題が発生する可能性があります。\foo\foobarasd FOObar lolasd FOOBAR lol

私のニーズを明確にしていただければ幸いです。これは一般的なタスクである可能性があると考えているため、競合するプレフィックスがある場合にこの種の問題を考慮した Qt ソリューションがあることを願っています。

これが些細なトピックである場合は申し訳ありませんが (そうかもしれないと思います)、エンコーディングの手法や問題についてはまったく詳しくありません。また、Qt エンコーディングに関する私の知識では、非常に単純な Unicode 関連の問題しか扱っていません。

EDIT:ところで、私の場合、リソースや外部ファイル、または再コンパイルを必要としないものに基づくデータ指向のアプローチは素晴らしいでしょう。

4

2 に答える 2

0

あなたの質問は、「一連の正規表現または単純な文字列置換を実行して、テキストの 2 つのエンコーディング間をマッピングしたい」のようです。

まず、マッピングを正確に行う必要があります。あなたが言うように、\foo や \foobar のようなエスケープ シーケンスが扱いにくい場合、双方向のロスレス マッピングがないことに気付くかもしれません。デザインやエンコーディングに欠陥がある場合、世界中のどのライブラリも役に立ちません。

正確な設計 (この関数の目的で提供される情報が完全に欠如しているため、これについてはお手伝いできません) が完成したら、文字列置換のシーケンスが適切であることに気付くでしょう。本当にもっと複雑な場合は、いくつかの QRegExp で十分です。

于 2013-05-02T21:43:43.753 に答える
0

質問に自分で答えるのはいつも少し醜いですが... たぶん、この解決策は誰かに役立つでしょう。

ニコラスの回答で示唆されているように、良い戦略は置換を使用することです。これは、単純な C/C++ エスケープなど、ほとんどの場合、シンプルで効果的です。

\n \r \t etc

それらはすべて異なるため、これは機能します。シーケンスがすべて異なる場合、特にシーケンスが別のシーケンスのプレフィックスでない場合は、常に置換で機能します。

たとえば、シーケンスが上記のシーケンスにいくつかのギリシャ文字を加えたものである場合、シーケンスが気に入らないため\nu、 に変換する必要がありますν

代わりに、置換関数が\nbeforeをテストする場合\nu、結果は間違っています。

両方のシーケンスが 2 つの完全に異なるエンティティに変換されると仮定すると、2 つの解決策があります。たとえば\nu;、近いシーケンス文字を配置するか、単に最長の文字列から短い文字列に置き換えるだけです。これにより、別のプレフィックスであるシーケンスがその前に置き換えられないことが保証されます。

さまざまな理由から、私は別の方法を試しました。つまり、単語辞書のすべてのプレフィックスのツリーであるトライを使用しました。簡単に言うと、かなりうまく機能し、おそらく(ほとんどの)正規表現や置換よりも高速に機能します。

正規表現はステート マシンであり、入力を再処理することは珍しくありません。トライを使用すると、文字を 2 回再照合することを回避できるため、かなり高速になります。

試行のコードはインターネットで簡単に見つけることができ、効率的なマッチングを行うための変更は簡単なので、ここではコードを記述しません。

于 2013-05-02T22:55:13.643 に答える