【C#】Char.IsSurrogateメソッドで指定した文字がサロゲートコードかどうかを判定する方法
C#で文字列内の指定された位置にある文字がサロゲートコードポイント(Unicode範囲 U+D800 ~ U+DFFF)を持つかどうかを確認するには、Char.IsSurrogateメソッドを使用します。このメソッドは、指定位置の文字が上位サロゲートまたは下位サロゲートである場合に true を返します。
サロゲートは、絵文字などの補助文字(BMP外の文字)をUTF-16で表現するために使われる特殊なコード単位で、通常はペアで構成されます。文字列処理を行う際にこの判定は非常に重要です。
例1:サロゲート値を含む場合
以下の例では、文字配列の末尾(インデックス4)にサロゲート値 \uD800 を含む文字列を作成し、Char.IsSurrogate で判定しています。
using System;
public class Demo {
public static void Main() {
string str = new String(new char[] { 'k', 'm', 'g', 't', '\uD800' });
bool res = Char.IsSurrogate(str, 4);
if (res)
Console.WriteLine("Contains Surrogate value!");
else
Console.WriteLine("Does not contain Surrogate value!");
}
}出力
上記のコードを実行すると、次の出力が得られます。
Contains Surrogate value!
インデックス4の文字がサロゲートコードポイント(U+D800)であるため、true が返されています。
例2:サロゲート値を含まない場合
続いて、すべてが通常の英字で構成された文字列の場合を見てみましょう。
using System;
public class Demo {
public static void Main() {
string str = new String(new char[] { 'k', 'm', 'g', 't', 'w' });
bool res = Char.IsSurrogate(str, 4);
if (res)
Console.WriteLine("Contains Surrogate value!");
else
Console.WriteLine("Does not contain Surrogate value!");
}
}出力
実行結果は以下のとおりです。
Does not contain Surrogate value!
この場合、インデックス4の文字「w」は通常のASCII文字であり、サロゲート範囲には含まれないため false が返されます。
まとめ
Char.IsSurrogate(string, int):指定した文字列の指定位置の文字がサロゲートかどうかを判定する。Char.IsHighSurrogate(char):上位サロゲート(U+D800 ~ U+DBFF)かどうかを判定する。Char.IsLowSurrogate(char):下位サロゲート(U+DC00 ~ U+DFFF)かどうかを判定する。
マルチバイト文字や絵文字を扱うアプリケーションでは、文字列を正しく分割・解析するために、これらのメソッドを活用することをおすすめします。
-
C#で入力された数値がアームストロング数かどうかを判定するプログラム
アームストロング数(Armstrong Number)とは、3桁の数値の場合、各桁の数字を3乗した値の合計が、元の数値そのものと等しくなる数のことです。例として挙げられるのが「153」です。153は以下のように表すことができます。1³ + 3³ + 5³C#でアームストロング数かどうかを判定するには、まず対象となる数値の各桁を取り出し、それぞれの3乗を足し合わせていきます。ここでは、判定したい数値を変数「val」に格納しています。ループ処理では、10で割りながら余りを求めることで、一の位から順に各桁の数字を取り出します。for (int i = val; i > 0; i = i / 1
-
Pythonで文字列の平均文字が存在するかどうかを確認する方法
英数字を含む文字列 s が与えられたとき、その文字列の「平均文字」が存在するかどうかを判定し、存在する場合はその文字を返すプログラムを作成します。ここでいう平均文字とは、文字列内の各文字のASCII値の平均を計算し、その小数点以下を切り捨てた値に対応する文字のことです。 問題の例 例えば、入力が s = pqrst の場合、出力は r になります。これは、各文字のASCII値の平均が以下のように計算されるためです。 (112 + 113 + 114 + 115 + 116) / 5 = 570 / 5 = 114 ASCII値 114 に対応する文字は r なので、答えは r となります。 解