كيف يمكنني تحديد ما إذا كان النص مكتوبًا بالأحرف السيريلية؟
-
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 علامات استفهام في ذلك