LoginSignup
0
0

【C#】単独濁点(「゛」や「゜」)で表現されている2文字を1文字に正規化する

Last updated at Posted at 2024-01-30

環境

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();
    }
}

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0