Wie kann ich feststellen, ob Text in kyrillischen Zeichen ist?
-
03-07-2019 - |
Frage
My Junk-Mail-Ordner wurde mit Nachrichten füllen komponiert, was scheint, das kyrillische Alphabet zu sein. Wenn ein Nachrichtentext oder eine Nachricht Thema in Kyrillisch ist, möchte ich es dauerhaft löschen.
Auf meinem Bildschirm sehe ich kyrillische Zeichen, aber wenn ich durch die Nachrichten in VBA in Outlook iterieren, die „Betreff“ Eigenschaft der Nachricht zurückgibt Fragezeichen.
Wie kann ich feststellen, ob der Betreff der Nachricht in kyrillischen Zeichen ist?
(Anmerkung: Ich habe die „Internetcode“ Eigenschaft untersucht habe - es ist in der Regel in Westeuropa).
Lösung
Der String
Datentyp in VB / VBA kann Unicode-Zeichen umgehen, aber die IDE selbst hat Probleme bei der Darstellung ihnen (daher die Fragezeichen).
Ich schrieb eine IsCyrillic
Funktion, die Ihnen helfen kann. Die Funktion nimmt ein einziges Argument und gibt String
True
wenn die Zeichenfolge mindestens ein Zeichen enthält Kyrillisch. Getestet habe ich diesen Code mit Outlook 2007 und es scheint gut zu funktionieren. Um es zu testen, schickte ich ein paar E-Mails mit kyrillischen Text in der Betreffzeile und überprüft, dass mein Testcode richtig, diese E-Mails aus den Reihen alles andere in meinem Posteingang herausgreifen könnte.
Also, ich habe eigentlich zwei Code-Schnipsel:
- Der Code, der die
IsCyrillic
Funktion enthält. Dies kann Kopie kleistert in ein neues Modul oder VBA hinzugefügt der Code, den Sie bereits haben. - Die
Test
Routine I (in Outlook VBA) geschrieben zu testen, dass der Code tatsächlich funktioniert. Es zeigt, wie dieIsCyrillic
Funktion verwenden.
Der Kodex
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
Beispiel Verwendung
' 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
Andere Tipps
die „Betreff“ Eigenschaft der Nachricht gibt eine Reihe von Fragezeichen.
Ein klassisches String-Codierung Problem. Klingt wie dieser Eigenschaft zurückgibt ASCII, aber Sie wollen UTF-8 oder Unicode.
Es scheint mir, Ihnen eine einfache Lösung haben bereits - für jeden Betreffzeile suchen nur mit (sagen wir) 5 Fragezeichen in es