【C#】String.IsNormalizedメソッドの使い方!Unicode正規化の判定方法を解説
C#のString.IsNormalized()メソッドは、その文字列が特定のUnicode正規化形式(Normalization Form)に従っているかどうかを判定するためのメソッドです。文字列が指定された正規化形式であれば true、そうでなければ false を返します。
構文
IsNormalizedメソッドには、次の2つのオーバーロードが用意されています。
public bool IsNormalized (); public bool IsNormalized (System.Text.NormalizationForm normalizationForm);
引数を指定しない場合は、既定の正規化形式(FormC)で判定されます。引数を指定する場合、パラメータ normalizationForm には判定対象となるUnicode正規化形式を渡します。
Unicode正規化形式の種類
- FormC … 正規化形式C(NFC)。分解後に再合成する標準的な形式
- FormD … 正規化形式D(NFD)。文字を分解する形式
- FormKC … 正規化形式KC(NFKC)。互換性を考慮して分解後、再合成する形式
- FormKD … 正規化形式KD(NFKD)。互換性を考慮して分解する形式
使用例1
まず、基本的な使い方を見てみましょう。
using System;
public class Demo {
public static void Main(String[] args) {
string str1 = "Ryan";
string str2 = "Matt";
Console.WriteLine("String 1 = "+str1);
Console.WriteLine("HashCode of String 1 = "+str1.GetHashCode());
Console.WriteLine("Index of character 'k' in str1 = " + str1.IndexOf("k"));
Console.WriteLine("\nString 2 = "+str2);
Console.WriteLine("HashCode of String 2 = "+str2.GetHashCode());
Console.WriteLine("Index of character 'k' in str2 =" + str2.IndexOf("k"));
bool res1 = str1.Contains(str2);
res1 = str1.IsNormalized();
Console.WriteLine("\nThe str1 is in normalized form = "+res1);
bool res2 = str1.Contains(str2);
res2 = str2.IsNormalized();
Console.WriteLine("The str2 is in normalized form = "+res2);
}
}
実行結果
上記のプログラムを実行すると、次のような出力が得られます。
String 1 = Ryan HashCode of String 1 = 1580592915 Index of character 'k' in str1 = -1 String 2 = Matt HashCode of String 2 = -1920007383 Index of character 'k' in str2 =-1 The str1 is in normalized form = True The str2 is in normalized form = True
この例では、引数なしのIsNormalized()を呼び出しているため、既定の正規化形式であるFormCで判定されます。結果として、どちらの文字列も正規化済みと判断され、「True」が返されています。
使用例2
続いて、正規化形式を明示的に指定する例を見てみましょう。
using System;
using System.Text;
public class Demo {
public static void Main(String[] args) {
string str1 = "Imagine Dragons";
string str2 = "Imagine";
Console.WriteLine("String 1 = "+str1);
Console.WriteLine("HashCode of String 1 = "+str1.GetHashCode());
Console.WriteLine("String 2 = "+str2);
Console.WriteLine("HashCode of String 2 = "+str2.GetHashCode());
Console.WriteLine("String 1 is equal to String 2: {0}", str1.Equals(str2));
Console.WriteLine("str1 is normalized to form C? = {0}",
str1.IsNormalized(NormalizationForm.FormC));
Console.WriteLine("str2 is normalized to form C? = {0}", (str2.IsNormalized(NormalizationForm.FormC)));
Console.WriteLine("str1 is normalized to form D? = {0}", str1.IsNormalized(NormalizationForm.FormD));
Console.WriteLine("str2 is normalized to form D? = {0}", str2.IsNormalized(NormalizationForm.FormD));
Console.WriteLine("str1 is normalized to form KC? = {0}", str1.IsNormalized(NormalizationForm.FormKC));
Console.WriteLine("str2 is normalized to form KC? = {0}", str2.IsNormalized(NormalizationForm.FormKC));
Console.WriteLine("str1 is normalized to form KD? = {0}", str1.IsNormalized(NormalizationForm.FormKD));
Console.WriteLine("str2 is normalized to form KD? = {0}", str2.IsNormalized(NormalizationForm.FormKD));
}
}
実行結果
上記のプログラムを実行すると、次のような出力が得られます。
String 1 = Imagine Dragons HashCode of String 1 = -1546868095 String 2 = Imagine HashCode of String 2 = -1414695254 String 1 is equal to String 2: False str1 is normalized to form C? = True str2 is normalized to form C? = True str1 is normalized to form D? = True str2 is normalized to form D? = True str1 is normalized to form KC? = True str2 is normalized to form KC? = True str1 is normalized to form KD? = True str2 is normalized to form KD? = True
このように、IsNormalizedメソッドに NormalizationForm の値を渡すことで、FormC・FormD・FormKC・FormKDの各正規化形式ごとに判定を行うことができます。英数字のみの文字列はすべての形式で正規化済みと判定されますが、濁点やアクセント記号などを含む文字列では、形式によって結果が異なる場合があります。
まとめ
String.IsNormalizedメソッドを使うことで、文字列がUnicode正規化形式に従っているかどうかを簡単にチェックできます。ユーザー入力や外部から取得したデータを比較・検索する前に正規化状態を確認したい場合などに役立ちます。なお、文字列を実際に正規化したい場合は、String.Normalize() メソッドを使用します。
-
C#のSingleOrDefault()メソッドの使い方をわかりやすく解説
SingleOrDefault()メソッドとはC#のLINQに含まれるSingleOrDefault()メソッドは、シーケンスから単一の特定要素を返すメソッドです。大きな特徴は、要素がシーケンス内に存在しない場合でも例外をスローせず、その型のデフォルト値を返すという点にあります。たとえば参照型の場合は null、数値型の場合は 0 といったデフォルト値が返されるため、空のコレクションを安全に扱いたい場面で非常に便利です。Single()メソッドとの違い似た名前の Single() メソッドは、要素が存在しない場合や複数の要素が見つかった場合に例外(InvalidOperationExcepti
-
【C#】String.Join()メソッドで文字列配列を連結する方法
String.Join()メソッドとはC#のString.Join()メソッドは、文字列配列のすべての要素を1つの文字列に連結するためのメソッドです。各要素の間には、引数で指定した区切り文字(セパレーター)が自動的に挿入されます。たとえば、区切り文字として改行コード「\n」を指定すれば、配列の各要素がそれぞれ別の行に配置された、複数行の文字列を簡単に作成できます。基本的な構文String.Join(\n, starray);第1引数: 要素間に挿入する区切り文字第2引数: 連結対象の文字列配列戻り値: 連結された1つの文字列サンプルコード以下は、5つの文字列要素を持つ配列を改行コードで連結し、