مشاركة عبر


فهرسة السلاسل

توفر الفئة System.Globalization.StringInfo الأساليب التي تتيح لك تقسيم سلسلة إلى عناصر نصوص ثم التكرار خلال عناصر النصوص تلك. عنصر النص هو وحدة نص يتم عرضها كحرف واحد يسمى grapheme. يمكن أن يكون عنصر النص حرف أساسي، أو زوج مركب، أو تسلسل حروف مدمجة. للحصول على مزيد من المعلومات حول الأزواج البديلة و تسلسلات الأحرف المدمجة، راجع دعم Unicode للأزواج البديلة و تسلسلات الأحرف المدمجة.

قم باستخدام الأسلوب StringInfo.GetTextElementEnumerator لإنشاء عداد يمكنه التكرار خلال عناصر السلسلة. قم باستخدام الأسلوب StringInfo.ParseCombiningCharacters لإرجاع فهارس لكل حرف أساسي، أو حرف بديل مرتفع، أو عنصر تحكم في سلسلة محددة.

في مثال التعليمات البرمجية التالي، يتم إنشاء سلسلة أحرف عربية تحتوي على تسلسلات أحرف مدمجة. في strCombining ، على سبيل المثال، يمثل الرمز Unicode U + 0625 حرف عربي أساسي (الحرف العربي ألف بهمزة تحته) ، و يمثل الرمز Unicode U + 0650 حرف دمج عربي (الكسرة العربية). تمثل هذه الرموز معاً تسلسل أحرف مدمجة و لذلك يجب تحليلها كعنصر نص واحد. و بعد ذلك، يتم إنشاء سلسلة تحتوي على أزواج بديلة. في 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();
         }
   }
}
ملاحظةملاحظة

إذا قمت بتنفيذ هذه التعليمات البرمجية في تطبيق وحدة تحكم، عناصر النص Unicode المحددة لن يتم عرضها بشكل صحيح لأن بيئة وحدة التحكم لا تدعم كافة أحرف Unicode.

راجع أيضًا:

المرجع

StringInfo

المبادئ

Unicode في .NET Framework

موارد أخرى

الترميز و الترجمة