C#에서 문자열 내 특정 위치의 문자가 서러게이트(Surrogate) 코드를 포함하고 있는지 확인하려면 Char.IsSurrogate() 메서드를 사용할 수 있습니다.
Char.IsSurrogate() 메서드란?
Char.IsSurrogate(string str, int index)는 지정된 문자열에서 해당 인덱스 위치의 문자가 상위 서러게이트(U+D800~U+DBFF) 또는 하위 서러게이트(U+DC00~U+DFFF) 범위에 속하는지 판별합니다. 결과는 bool 값으로 반환되며, 서러게이트 문자이면 true, 그렇지 않으면 false를 반환합니다.
예제 1: 서러게이트 문자가 포함된 경우
다음 예제에서는 문자 배열에 서러게이트 코드 \uD800을 포함시킨 후, 인덱스 4번째 문자를 검사합니다.
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("서러게이트 값이 포함되어 있습니다!");
else
Console.WriteLine("서러게이트 값이 포함되어 있지 않습니다!");
}
}출력 결과
서러게이트 값이 포함되어 있습니다!
인덱스 4에 위치한 \uD800은 유효한 상위 서러게이트이므로 Char.IsSurrogate()가 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("서러게이트 값이 포함되어 있습니다!");
else
Console.WriteLine("서러게이트 값이 포함되어 있지 않습니다!");
}
}출력 결과
서러게이트 값이 포함되어 있지 않습니다!
인덱스 4의 문자 'w'는 일반 ASCII 문자이므로 서러게이트로 판별되지 않고 false가 반환됩니다.
정리
Char.IsSurrogate() 메서드는 유니코드 확장 문자(예: 이모지, 한글 확장 등 BMP 외부 문자)를 다룰 때 매우 유용합니다. UTF-16 환경에서 하나의 문자가 두 개의 char(상위·하위 서러게이트 쌍)로 표현될 수 있기 때문에, 문자열을 안전하게 처리하려면 서러게이트 여부 검사가 필요할 수 있습니다.