MS Dynamics hat ein Problem, bei dem kein Zeichen außerhalb von x20 bis x7f zulässig ist und einige Zeichen innerhalb dieses Bereichs ebenfalls ungültig sind. Meine Antwort war, ein Array mit den ungültigen Zeichen zu erstellen, das die beste Schätzung der gültigen Zeichen liefert.
Es ist nicht schön, aber es funktioniert.
Function PlainAscii(InText)
Dim i, c, a
Const cUTF7 = "^[\x20-\x7e]+$"
Const IgnoreCase = False
PlainAscii = ""
If InText = "" Then Exit Function
If RegExTest(InText, cUTF7, IgnoreCase) Then
PlainAscii = InText
Else
For i = 1 To Len(InText)
c = Mid(InText, i, 1)
a = Asc(c)
If a = 10 Or a = 13 Or a = 9 Then
' Do Nothing - Allow LF, CR & TAB
ElseIf a < 32 Then
c = " "
ElseIf a > 126 Then
c = CvtToAscii(a)
End If
PlainAscii = PlainAscii & c
Next
End If
End Function
Function CvtToAscii(inChar)
' Maps The Characters With The 8th Bit Set To 7 Bit Characters
Dim arrChars
arrChars = Array(" ", " ", "$", " ", ",", "f", """", " ", "t", "t", "^", "%", "S", "<", "O", " ", "Z", " ", " ", "'", "'", """", """", ".", "-", "-", "~", "T", "S", ">", "o", " ", "Z", "Y", " ", "!", "$", "$", "o", "$", "|", "S", " ", "c", " ", " ", " ", "_", "R", "_", ".", " ", " ", " ", " ", "u", "P", ".", ",", "i", " ", " ", " ", " ", " ", " ", "A", "A", "A", "A", "A", "A", "A", "C", "E", "E", "E", "E", "I", "I", "I", "I", "D", "N", "O", "O", "O", "O", "O", "X", "O", "U", "U", "U", "U", "Y", "b", "B", "a", "a", "a", "a", "a", "a", "a", "c", "e", "e", "e", "e", "i", "i", "i", "i", "o", "n", "o", "o", "o", "o", "o", "/", "O", "u", "u", "u", "u", "y", "p", "y")
CvtToAscii = arrChars(inChar - 127)
End Function
Function RegExTest(ByVal strStringToSearch, strExpression, IgnoreCase)
Dim objRegEx
On Error Resume Next
Err.Clear
strStringToSearch = Replace(Replace(strStringToSearch, vbCr, ""), vbLf, "")
RegExTest = False
Set objRegEx = New RegExp
With objRegEx
.Pattern = strExpression '//the reg expression that should be searched for
If Err.Number = 0 Then
.IgnoreCase = CBool(IgnoreCase) '//not case sensitive
.Global = True '//match all instances of pattern
RegExTest = .Test(strStringToSearch)
End If
End With
Set objRegEx = Nothing
On Error Goto 0
End Function
Ihre Antwort wird notwendigerweise anders sein.
How are you 'am nächsten ascii-Äquivalente' definieren? Akzente entfernen? – mmr
naja ... wenn es irgendeine Definition außer der Konvertierung gibt? Ich würde es gerne :) Ich denke, in Fällen von Akzenten ist es nur entfernen. – Andrey
@mmr: Ich weiß nicht über Andreys beabsichtigte Verwendung, aber ich habe ein Programm, das Text akzeptieren soll und es einem angeschlossenen Gerät geben soll, das es später anzeigen wird. Viele Arten von angeschlossenen Geräten können sich nicht den RAM leisten, der zum Speichern von Multi-Byte-Zeichen erforderlich ist, und könnten sich nicht das ROM leisten, das zum Speichern von mehr als 256 Zeichen erforderlich ist [die meisten Zeichenmatrix-LCD-Module haben ein festes 160-Zeichen set plus die Fähigkeit, acht gleichzeitig benutzerdefinierte 5x7 oder 5x8 Glyphen anzuzeigen]. Rendern aller Nicht-ASCII-Texte als "?" würde unnötig hässlich scheinen. – supercat