👌
いろいろなプログラミング言語で NFD の濁音・半濁音を NFC に変換する・その3
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