短い答え:両方の文字列を「正規化」し、検索/比較を行います。
Unicodeは複数のアクセント付き文字を複数表現しています。アクセントのある文字を表す単一のコードポイント(U + 00E9 LATIN SMALL EとACUTE ACCENT)がありますが、コードポイントの組み合わせで表すこともできます(U + 0065 LATIN SMALL LETTER EとU + 0301 COMBINING ACUTE ACCENT )。これに対処する一般的な方法は、1つのノーマルフォームC(事前に構成された文字の場合)またはD(構成されていない文字の場合)を選択することです。ノーマライズは、それよりも複雑に見えます。両方の文字列が同じ標準形式になったら、それらを直接比較することができます。
発音区別符を完全に無視する場合は、独自の正規化スキームを作成できます。たとえば、事前に作成された文字を分解してから、すべての合成コードポイントを削除することができます。アクセント付き文字が元々どのように表現されていたかにかかわらず、ベース文字がアクセント付き文字と一致することができます。
Unicode(KCおよびKD)には、ほとんどの特殊文字を最もよく似た基本文字に置き換える "kompatibility"標準形式もあります。発音区別弁の場合、私はこれが同じことをすると思います。だから、もしあなたがUnicodeライブラリを持っていれば、それを使って正規化のすべての苦労をすることができるかもしれません。
多くの場合、データベースはすでに通常の形式になっているため、検索文字列を正規化するだけです。
すべてが複雑すぎる場合、別の方法は、どの表現にも一致する正規表現を作成することです。たとえば、検索キーがtelefono
の場合は、t(e|\u00E9|e\u0301)l(e|\u00E9|e\u0301)f(o|\u00F3|o\u0301)n(o|\u00F3|o\u0301)
のような正規表現に変換します。それらの正規表現は、マッチをどれだけ柔軟にしたいかによってかなり高速になる可能性があります。
[すべてのアクセント付き文字をC++の通常の文字に変更](https://stackoverflow.com/questions/14094621/change-all-accessed-letters-to-normal-letters-in-c) – Kevin
I私の質問は本当に重複しているとは思わない。つまり、私はバックアップ計画としてそれをすることを考えましたが、実際にやっていることではありません。 –
真の*複製ではないと思いますが、あなたのソリューションの一部として間違いなく使用することができます。 – Kevin