私はカナダフランス語の文字列を変換しようとしていますが、基本的には、文字はそのままにして、文字内のフランス語のアクセント記号を取り除けるようにしたいと考えています。(例:é
を に変換するe
と、 にcrème brûlée
なりますcreme brulee
)
これを実現するための最良の方法は何でしょうか?
ベストアンサー1
私はこの方法を使ったことはありませんが、Michael Kaplan は、発音区別符号の削除について説明したブログ記事 (紛らわしいタイトル) で、この方法について説明しています。ストリッピングは面白い仕事です (別名、意味がないということ、別名、すべての Mn 文字は非スペースですが、一部の文字は他の文字よりも非スペースが多い)
static string RemoveDiacritics(string text)
{
var normalizedString = text.Normalize(NormalizationForm.FormD);
var stringBuilder = new StringBuilder(capacity: normalizedString.Length);
for (int i = 0; i < normalizedString.Length; i++)
{
char c = normalizedString[i];
var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
if (unicodeCategory != UnicodeCategory.NonSpacingMark)
{
stringBuilder.Append(c);
}
}
return stringBuilder
.ToString()
.Normalize(NormalizationForm.FormC);
}
これは彼の以前の投稿の続編であることに注意してください。発音区別符号を削除します....
このアプローチでは文字列.正規化入力文字列を構成グリフに分割し (基本的には「基本」文字を発音区別記号から分離)、結果をスキャンして基本文字のみを保持します。少し複雑ですが、実際には複雑な問題です。
もちろん、フランス語に限定するのであれば、おそらくシンプルなテーブルベースのアプローチで済むでしょう。C++ std::string でアクセントとチルダを削除する方法@David Dibben の推奨どおりです。