0

デバッグウィンドウにペルシア語のアルファベットを順番に表示しようとしています。最後の文字に達すると、後続の文字にそのグループが乗算されます。たとえば、文字「A」のペルシア語でalef(ا)を表示する場合は、インデックス1から始めます。 。インデックスが33(ペルシア語は32文字)に達すると、(اا)と表示されます。

以下のコードはラテンアルファベット(「abcdefj ...」など)では問題なく機能しますが、ペルシア語/アラビア語では2つの問題があります。

  1. 32ではなく33のカウントになります。つまり、文字「ه」の後に空白文字が生成されます。これだと思いますが、どう説明したらいいのかわかりません。
  2. 「شش」(スペースなし)のように2倍にする必要がある文字の場合、「شش」と表示されます。

    Sub Main()
        Dim t As New PersianAlphabet
        For i = 1 To 50
            Debug.WriteLine(t.NextLetter())
        Next
    End Sub
    
    Public Class PersianAlphabet
        Private charArray As String
        Private charCount As Integer
        Private CurrentNumber As Integer = 0
        Sub New()
            'Dim charArray1() = {"ا", "ب", "پ", "ت", "ث", "ج", "چ", "ح", "خ", "د", "ذ", "ر", "ز", "ژ", "س", "ش", "ص", "ض", "ط", "ظ", "ع", "غ", "ف", "ق", "ک", "گ", "ل", "م", "ن", "و", "ه‍", "ی"}
            'Dim joined As String = String.Join("", charArray1)
            'Me.charArray = joined
            Me.charArray = "ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوه‍ی"
            Me.charCount = charArray.ToCharArray.Count
        End Sub
        Public Function NextLetter(Optional ByVal StartAt As Integer = 1) As String
            Dim count = (Me.CurrentNumber + StartAt)
    
            Dim divisor = count / Me.charCount
            Dim outstring As New StringBuilder
    
            If divisor <= 1 Then
                outstring.Append(charArray(Int32.Parse(count - 1)))
            Else
                Dim tempAlphaCount = Int(divisor) + 1
                Dim groupRange = Int(divisor) * Me.charCount
                Dim alphaIndex = count - groupRange
                If alphaIndex = 0 Then
                    tempAlphaCount = tempAlphaCount - 1
                    alphaIndex = Me.charCount
                End If
                alphaIndex -= 1
    
                For i = 0 To tempAlphaCount - 1
                    outstring.Append(charArray(Int32.Parse(alphaIndex)))
                Next
            End If
    
            Me.CurrentNumber += 1
            Return outstring.ToString
        End Function
    End Class
    

誰かが以前にこれらの2種類の問題に対処したことがありますか?何か考え/アドバイスはありますか?

4

1 に答える 1

0

文字列内に 2805 の Unicode (予想される 2804 ではない) があることがわかりました。それを削除すると、正しいカウントが得られます。それを 2 つの文字の間に入れると、文字を結合しないこともできます。

于 2011-10-29T18:15:29.057 に答える