環境
macOS
Rider
dotnet7
コード
public class Normalization
{
// 単独濁点を置き換えるマップ
private Dictionary<char, char> dakutenMap = new()
{
{ 'カ', 'ガ' }, { 'キ', 'ギ' }, { 'ク', 'グ' }, { 'ケ', 'ゲ' }, { 'コ', 'ゴ' },
{ 'サ', 'ザ' }, { 'シ', 'ジ' }, { 'ス', 'ズ' }, { 'セ', 'ゼ' }, { 'ソ', 'ゾ' },
{ 'タ', 'ダ' }, { 'チ', 'ヂ' }, { 'ツ', 'ヅ' }, { 'テ', 'デ' }, { 'ト', 'ド' },
{ 'ハ', 'バ' }, { 'ヒ', 'ビ' }, { 'フ', 'ブ' }, { 'ヘ', 'ベ' }, { 'ホ', 'ボ' },
};
// 単独半濁点を置き換えるマップ
private Dictionary<char, char> hanDakutenMap = new()
{
{ 'ハ', 'パ' }, { 'ヒ', 'ピ' }, { 'フ', 'プ' }, { 'ヘ', 'ペ' }, { 'ホ', 'ポ' },
};
// 文字列中の濁点を正規化する
public string Invoke(string input)
{
var result = new StringBuilder();
for (var i = 0; i < input.Length; i++)
{
var currentChar = input[i];
// ゛か゜がある場合、変換を行う
if (i < input.Length - 1 && (input[i + 1] == '゛' || input[i + 1] == '゜'))
{
result.Append(ConvertToSingleDakutenChar(currentChar, input[i + 1]));
// 2文字処理したので1つ進める
i++;
}
else
{
result.Append(currentChar);
}
}
return result.ToString();
}
private string ConvertToSingleDakutenChar(char originalChar, char dakutenType)
{
switch (dakutenType)
{
case '゛':
{
// 濁点マップに存在する場合は変換、存在しない場合はそのまま返す
if (dakutenMap.TryGetValue(originalChar, out var convertedChar))
{
return convertedChar;
}
break;
}
case '゜':
{
// 半濁点マップに存在する場合は変換、存在しない場合はそのまま返す
if (hanDakutenMap.TryGetValue(originalChar, out var convertedChar))
{
return convertedChar;
}
break;
}
}
return originalChar.ToString();
}
}
参考