👌

いろいろなプログラミング言語で NFD の濁音・半濁音を NFC に変換する・その3

2024/07/18に公開

Dart

test.dart
import "package:unorm_dart/unorm_dart.dart" as unorm;

String dakuonNormalize(String str) {
    var regex = RegExp(
        r'[\p{Script=Hiragana}\p{Script=Katakana}]\p{Mn}',
        unicode: true);

    return str.replaceAllMapped(regex, (Match match) {
        return unorm.nfc(match.group(0)!);
    });
}

void main() {
    var str = "は\u3099は\u3099とハ\u309Aハ\u309Aと神";
    var ret = dakuonNormalize(str);

    print(str.runes.length);
    print(ret.runes.length);
    print(ret);
}

PowerShell

function DakuonNormalize($str) {
    return  $str -replace "[\p{IsHiragana}\p{IsKatakana}]\p{Mn}",
        {
            $_.Value.Normalize([Text.NormalizationForm]::FormC);
        }
}

$str = "は`u{3099}は`u{3099}とハ`u{309A}ハ`u{309A}と神";
$ret = DakuonNormalize($str);

echo $str.length;
echo $ret.length;
echo $ret;

C#

コンソールアプリを前提とする

using System.Text;
using System.Text.RegularExpressions;

string DakuonNormalize(string str)
{
    Regex regex = new Regex(@"[\p{IsHiragana}\p{IsKatakana}]\p{Mn}");
    return regex.Replace(str,
            match => match.Value.Normalize(NormalizationForm.FormC));
}


string str = "は\u3099は\u3099とハ\u309Aハ\u309Aと神";
string ret = DakuonNormalize(str);

Console.WriteLine(str.Length);
Console.WriteLine(ret.Length);
Console.WriteLine(ret);

コンソールアプリのプロジェクトは次のように生成した

dotnet new console -o myapp
cd myapp
dotnet run

F#

open System.Text
open System.Text.RegularExpressions

let DakuonNormalize(str: string): string =
  let regex = Regex @"[\p{IsHiragana}\p{IsKatakana}]\p{Mn}"
  regex.Replace(str, fun m -> m.Value.Normalize(NormalizationForm.FormC))

let str = "は\u3099は\u3099とハ\u309Aハ\u309Aと神"
let ret = DakuonNormalize(str)

printfn "%d" str.Length
printfn "%d" ret.Length
printfn "%s" ret

プロジェクトの生成とコードの実行は次のとおり

dotnet new console -lang=F#
dotnet run

Discussion