كيف يمكنني تحديد ما إذا كان النص مكتوبًا بالأحرف السيريلية؟

StackOverflow https://stackoverflow.com/questions/206719

  •  03-07-2019
  •  | 
  •  

سؤال

كان مجلد البريد غير الهام الخاص بي ممتلئًا بالرسائل المكتوبة بما يبدو أنه الأبجدية السيريلية.إذا كان نص الرسالة أو موضوع الرسالة باللغة السيريلية، فأنا أرغب في حذفه نهائيًا.

أرى على شاشتي أحرفًا سيريلية، ولكن عندما أتصفح الرسائل الموجودة في VBA داخل Outlook، فإن خاصية "الموضوع" الخاصة بالرسالة ترجع علامات استفهام.

كيف يمكنني تحديد ما إذا كان موضوع الرسالة مكتوبًا بالأحرف السيريلية؟

(ملحوظة:لقد قمت بفحص خاصية "InternetCodepage" - وهي عادةً ما تكون من أوروبا الغربية.)

هل كانت مفيدة؟

المحلول

ال String يمكن لنوع البيانات في VB/VBA التعامل مع أحرف Unicode، لكن IDE نفسه يواجه مشكلة في عرضها (وبالتالي علامات الاستفهام).

لقد كتبت IsCyrillic وظيفة قد تساعدك.الدالة تأخذ واحدة String الحجة والعودة True إذا كانت السلسلة تحتوي على حرف سيريلي واحد على الأقل.لقد اختبرت هذا الرمز مع Outlook 2007 ويبدو أنه يعمل بشكل جيد.لاختبار ذلك، أرسلت لنفسي بعض رسائل البريد الإلكتروني التي تحتوي على نص سيريلي في سطر الموضوع وتأكدت من أن رمز الاختبار الخاص بي يمكنه اختيار رسائل البريد الإلكتروني هذه بشكل صحيح من بين كل شيء آخر في صندوق الوارد الخاص بي.

لذا، لدي في الواقع مقتطفان من التعليمات البرمجية:

  • الكود الذي يحتوي على IsCyrillic وظيفة.يمكن نسخ ذلك في وحدة VBA جديدة أو إضافتها إلى الرمز الذي لديك بالفعل.
  • ال Test روتين كتبته (في Outlook VBA) لاختبار ما إذا كان الكود يعمل بالفعل.ويوضح كيفية استخدام IsCyrillic وظيفة.

الرمز

Option Explicit

Public Const errInvalidArgument = 5

' Returns True if sText contains at least one Cyrillic character'
' NOTE: Assumes UTF-16 encoding'

Public Function IsCyrillic(ByVal sText As String) As Boolean

    Dim i As Long

    ' Loop through each char. If we hit a Cryrillic char, return True.'

    For i = 1 To Len(sText)

        If IsCharCyrillic(Mid(sText, i, 1)) Then
            IsCyrillic = True
            Exit Function
        End If

    Next

End Function

' Returns True if the given character is part of the Cyrillic alphabet'
' NOTE: Assumes UTF-16 encoding'

Private Function IsCharCyrillic(ByVal sChar As String) As Boolean

    ' According to the first few Google pages I found, '
    ' Cyrillic is stored at U+400-U+52f                '

    Const CYRILLIC_START As Integer = &H400
    Const CYRILLIC_END  As Integer = &H52F

    ' A (valid) single Unicode char will be two bytes long'

    If LenB(sChar) <> 2 Then
        Err.Raise errInvalidArgument, _
            "IsCharCyrillic", _
            "sChar must be a single Unicode character"
    End If

    ' Get Unicode value of character'

    Dim nCharCode As Integer
    nCharCode = AscW(sChar)

    ' Is char code in the range of the Cyrillic characters?'

    If (nCharCode >= CYRILLIC_START And nCharCode <= CYRILLIC_END) Then
        IsCharCyrillic = True
    End If

End Function


مثال الاستخدام

' On my box, this code iterates through my Inbox. On your machine,'
' you may have to switch to your Inbox in Outlook before running this code.'
' I placed this code in `ThisOutlookSession` in the VBA editor. I called'
' it in the Immediate window by typing `ThisOutlookSession.TestIsCyrillic`'

Public Sub TestIsCyrillic()

    Dim oItem As Object
    Dim oMailItem As MailItem

    For Each oItem In ThisOutlookSession.ActiveExplorer.CurrentFolder.Items

        If TypeOf oItem Is MailItem Then

            Set oMailItem = oItem

            If IsCyrillic(oMailItem.Subject) Then

                ' I just printed out the offending subject line '
                ' (it will display as ? marks, but I just       '
                ' wanted to see it output something)            '
                ' In your case, you could change this line to:  '
                '                                               '
                '     oMailItem.Delete                          '
                '                                               '
                ' to actually delete the message                '

                Debug.Print oMailItem.Subject

            End If

        End If

    Next

End Sub

نصائح أخرى

<اقتباس فقرة>   

والممتلكات "الموضوع" من الرسالة بإرجاع مجموعة من علامات الاستفهام.

وA الكلاسيكية مشكلة ترميز السلسلة. يبدو أن الملكية تعود ASCII ولكنك تريد UTF-8 أو يونيكود.

ويبدو لي أن يكون لديك حل سهل بالفعل - مجرد إلقاء نظرة على أي سطر الموضوع مع (ويقول) 5 علامات استفهام في ذلك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top