다음을 통해 공유


문자열 인덱싱

System.Globalization.StringInfo 클래스에서 제공하는 메서드를 사용하여 문자열을 텍스트 요소로 나눈 다음 이러한 텍스트 요소 전체를 반복할 수 있습니다. 텍스트 요소는 단일 문자로 표시되는 텍스트의 단위입니다. 텍스트 요소는 기본 문자, 서로게이트 쌍 또는 조합 문자 시퀀스가 될 수 있습니다. 서로게이트 쌍 및 조합 문자 시퀀스에 대한 자세한 내용은 서로게이트 쌍 및 조합 문자 시퀀스에 대한 유니코드 지원을 참조하십시오.

StringInfo.GetTextElementEnumerator 메서드를 사용하여 문자열의 전체 요소를 반복하는 열거자를 만들 수 있습니다. StringInfo.ParseCombiningCharacters 메서드를 사용하여 지정된 문자열의 각 기본 문자, 상위 서로게이트 또는 제어 문자의 인덱스를 반환할 수 있습니다.

다음 코드 예제에서는 조합 문자 시퀀스가 들어 있는 아랍어 문자열을 만듭니다. 예를 들어, strCombining에서 유니코드 코드 U+0625는 아랍어 기본 문자(Arabic letter Alef with Hamza below)를, 유니코드 코드 U+0650은 아랍어 조합 문자(Arabic Kasra)를 나타냅니다. 이러한 코드들이 모여 조합 문자 시퀀스를 나타내므로 하나의 텍스트 요소로 구문 분석되어야 합니다. 그런 다음 서로게이트 쌍이 들어 있는 문자열을 만듭니다. 예를 들어, strSurrogates에서 유니코드 코드 U+DACE는 상위 서로게이트를, 유니코드 코드 U+DEFF는 하위 서로게이트를 나타냅니다. 이러한 코드들이 모여 서로게이트 쌍을 나타내므로 하나의 텍스트 요소로 구문 분석되어야 합니다. 각 문자열은 ParseCombiningCharacters 메서드를 사용하여 한 번 구문 분석된 다음 GetTextElementEnumerator 메서드를 사용하여 다시 구문 분석됩니다. 두 메서드 모두 strCombining에서 인덱스 0, 2, 3, 5 및 6의 텍스트 요소를 제대로 구문 분석합니다. 또한 두 메서드 모두 strSurrogates에서 인덱스 0, 2, 4, 5 및 6의 텍스트 요소를 제대로 구문 분석합니다. 그런 다음 구문 분석 작업 결과를 표시합니다.

Imports System
Imports System.IO
Imports System.Globalization
Imports System.Text
Imports Microsoft.VisualBasic

Public Class StringInfoSample

   Public Shared Sub Main()
      ' Creates a string with text elements at <0;2;3;5;6>.
      ' The Unicode code points specify Arabic 
      ' combining character sequences.
      Dim strCombining As String = ChrW(&H625) & ChrW(&H650) & _
         ChrW(&H64A) & ChrW(&H647) & ChrW(&H64E) & ChrW(&H627) & _
         ChrW(&H628) & ChrW(&H64C)

      ' Creates a string with text elements at <0;2;4;5;6>.
      'The Unicode code points specify private surrogate pairs.
      Dim strSurrogates As String = ChrW(&HDACE) & ChrW(&HDEFF) & _
         ChrW(&HDAAF) & ChrW(&HDEFC) & "a" & ChrW(&HD8BF) & ChrW(&HDD99)
      
      EnumerateTextElements(strCombining)
      EnumerateTextElements(strSurrogates)
   End Sub

   Public Shared Sub EnumerateTextElements(str As String)
      ' Creates a TextElementEnumerator.
      Dim TEIndices As Integer() = Nothing
      Dim TEEnum As TextElementEnumerator = Nothing      

      ' Parses the string using the ParseCombiningCharacters() method.
      Console.WriteLine(ControlChars.Newline + "Parsing '{0}' Using _
         ParseCombiningCharacters()...", str)
      Dim i As Integer
      TEIndices = StringInfo.ParseCombiningCharacters(str)
      For i = 0 To (TEIndices.Length - 1) - 1
         Console.WriteLine("Text Element {0} ({1}..{2})= {3}", i, _
            TEIndices(i), TEIndices((i + 1)) - 1, _
            str.Substring(TEIndices(i), TEIndices((i + 1)) - _
            TEIndices(i)))
      Next i
      Console.WriteLine("Text Element {0} ({1}..{2})= {3}", i, _
         TEIndices(i), str.Length - 1, str.Substring(TEIndices(i)))

      ' Parses the string using the GetTextElementEnumerator method.
      Console.WriteLine(ControlChars.Newline + "Parsing '{0}' Using _
         TextElementEnumerator...", str)
      TEEnum = StringInfo.GetTextElementEnumerator(str)

      Dim Continue As Boolean = False
      Dim TECount As Integer = - 1

      ' Note: Begins at element -1 (none).
      Continue = TEEnum.MoveNext()
      While Continue
         ' Prints the current element.
         ' Both GetTextElement() and Current retrieve the current
         ' text element. The latter returns it as an Object.
         TECount += 1
         Console.WriteLine("Text Element {0} ({1}..{2})= {3}", TECount, _
            TEEnum.ElementIndex, TEEnum.ElementIndex + _
            TEEnum.GetTextElement().Length - 1, TEEnum.Current)

         ' Moves to the next element.
         Continue = TEEnum.MoveNext()
      End While
   End Sub
End Class
using System;
using System.IO;
using System.Globalization;
using System.Text;

public class StringInfoSample
{
   public static void Main()
   {
      // Creates a string with text elements at <0;2;3;5;6>.
      // The Unicode code points specify Arabic 
      // combining character sequences.
      string strCombining =   
            "\u0625\u0650\u064A\u0647\u064E\u0627\u0628\u064C";
      // Creates a string with text elements at <0;2;4;5;6>.
      // The Unicode code points specify private surrogate pairs.
      string strSurrogates = "\uDACE\uDEFF\uDAAF\uDEFCa\uD8BF\uDD99"; 

      EnumerateTextElements(strCombining);
      EnumerateTextElements(strSurrogates);
   }

   public static void EnumerateTextElements(string str)
   {
      // Creates a TextElementEnumerator.
      int[] TEIndices = null;
      TextElementEnumerator TEEnum = null;

      // Parses the string using the ParseCombiningCharacters() method.
      Console.WriteLine
         ("\r\nParsing '{0}' Using ParseCombiningCharacters()...",str);
      int i;
      TEIndices = StringInfo.ParseCombiningCharacters(str);
      for (i = 0; i < (TEIndices.Length - 1); i++)
      {
         Console.WriteLine
            ("Text Element {0} ({1}..{2})= 
            {3}",i,TEIndices[i],TEIndices[i+1] - 1,
            str.Substring(TEIndices[i],TEIndices[i+1] - TEIndices[i]));
      }
      Console.WriteLine
         ("Text Element {0} ({1}..{2})= {3}",i,TEIndices[i],str.Length - 
         1, str.Substring(TEIndices[i]));

      // Parses the string using the GetTextElementEnumerator method.
      Console.WriteLine
         ("\r\nParsing '{0}' Using TextElementEnumerator...",str);
      TEEnum = StringInfo.GetTextElementEnumerator(str);

      bool Continue = false;
      int TECount = -1;

      // Note: Begins at element -1 (none).
      Continue = TEEnum.MoveNext();
      while (Continue)
      {
         // Prints the current element.
         // Both GetTextElement() and Current retrieve the current
         // text element. The latter returns it as an Object.
         TECount++;
         Console.WriteLine("Text Element {0} ({1}..{2})=  
               {3}",TECount,TEEnum.ElementIndex,
               TEEnum.ElementIndex + TEEnum.GetTextElement().Length - 1, 
               TEEnum.Current);

         // Moves to the next element.
         Continue = TEEnum.MoveNext();
         }
   }
}
참고참고

콘솔 응용 프로그램에서 이 코드를 실행하면 콘솔 환경이 모든 유니코드 문자를 지원하지는 않으므로 지정한 유니코드 텍스트 요소가 제대로 표시되지 않습니다.

참고 항목

참조

StringInfo

개념

.NET Framework의 유니코드

기타 리소스

인코딩 및 지역화