unicode - significado - ¿Cómo puedo determinar si el texto está en caracteres cirílicos?
cirilico significado (3)
Mi carpeta de correo no deseado se ha estado llenando de mensajes compuestos en lo que parece ser el alfabeto cirílico. Si el cuerpo de un mensaje o un asunto del mensaje está en cirílico, quiero eliminarlo permanentemente.
En mi pantalla veo caracteres cirílicos, pero cuando repito los mensajes en VBA dentro de Outlook, la propiedad "Asunto" del mensaje arroja signos de interrogación.
¿Cómo puedo determinar si el tema del mensaje está en caracteres cirílicos?
(Nota: he examinado la propiedad "InternetCodepage"; por lo general, es de Europa occidental).
la propiedad "Asunto" del mensaje arroja un montón de signos de interrogación.
Un problema clásico de codificación de cadenas. Parece que esa propiedad está devolviendo ASCII pero quieres UTF-8 o Unicode.
Me parece que ya tiene una solución fácil: simplemente busque cualquier línea de asunto con (por ejemplo) 5 signos de interrogación en ella
El tipo de datos String
en VB / VBA puede manejar caracteres Unicode, pero el IDE tiene problemas para mostrarlos (de ahí los signos de interrogación).
Escribí una función IsCyrillic
que podría ayudarte. La función toma un solo argumento de String
y devuelve True
si la cadena contiene al menos un carácter cirílico. Probé este código con Outlook 2007 y parece funcionar bien. Para probarlo, me envié algunos correos electrónicos con texto cirílico en la línea de asunto y verifiqué que el código de mi prueba podía seleccionar correctamente esos correos de entre todos los demás en mi Bandeja de entrada.
Entonces, en realidad tengo dos fragmentos de código:
- El código que contiene la función
IsCyrillic
. Esto se puede copiar y pegar en un nuevo módulo de VBA o agregar al código que ya tiene. - La rutina de
Test
que escribí (en Outlook VBA) para probar que el código realmente funciona. Demuestra cómo usar la funciónIsCyrillic
.
El código
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
Ejemplo de uso
'' 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