|
Trotz internationaler Zeichensätze ist es nach wie vor manchmal
notwendig, Umlaute in einem deutschsprachigen Text auszuschreiben -
statt "ä" wird "ae", statt "ö" wird
"oe" usw. geschrieben. Etwa hin und wieder im
Email-Verkehr und in einer ganzen Reihe von Newsgroups und
Mail-Listen ist die Ausschreibung eine immer noch gepflegte
Gewohnheit. Eine Funktion, die die Konvertierung der Umlaute
nachträglich und automatisch vornimmt, wäre da sicher ganz
praktisch.
Auf den ersten Blick scheint das kein sonderlich großes Problem
zu sein. Schließlich gibt es ab Visual Basic 6 die
Funktion Replace,
mit der Sie bequem ein Zeichen oder eine Zeichenfolge gegen ein
anderes Zeichen bzw. gegen eine Zeichenfolge austauschen können
(für Visual Basic 5 müssen Sie allerdings eine solche
Funktion erst noch selber schreiben).
Ganz so einfach ist die Angelegenheit jedoch nicht. Denn tauschen
Sie ein "Ä" gegen "AE" aus, gibt das nur AErger.
Falls Sie nun aber, um diesen Lapsus zu vermeiden, ganz clever das
"Ä" gegen "Ae" tauschen wollen, handeln Sie
sich damit auch nur wieder AeRGER ein. Die elegante Replace-Funktion
hilft uns hier also nicht weiter - wir brauchen für diesen Zweck
eine eigene Funktion, die Funktion ConvertChars.
Sie übergeben ihr den zu konvertierenden Text und ein Array mit
den zu tauschenden Zeichen-Paaren. Das Array ist ein einfaches
Variant-Array, damit die Zusammenstellung der Zeichen-Paare
einfacher wird und sich die Dimensioniererei erübrigt. Der Aufruf,
der die Umlaute ausschreibt und das "ß" in ein "ss"
umwandelt, sähe beispielsweise so aus:
Dim nText As String
Dim nPairs As Variant
Dim nTextConverted As String
nText = "Übler Ärger mit Glockengeläut, der in der Öffentlichkeit" _
& " öfters das erträgliche Maß übersteigt"
nPairs = Array("Ä", "Ae", "Ö", "Oe", "Ü", "Ue", "ä", "ae", _
"ö", "oe", "ü", "ue", "ß", "ss")
nTextConverted = ConvertChars(nText, nPairs)
Sie können natürlich statt "ss" auch "sz"
wählen - diese Ausschreibungskonvention ist ebenfalls hin und
wieder anzutreffen.
Private Declare Function IsCharAlpha Lib "user32" _
Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long
Private Declare Function IsCharUpper Lib "user32" _
Alias "IsCharUpperA" (ByVal cChar As Byte) As Long
Public Function ConvertChars(Text As String, Pairs As Variant) _
As String
Dim nText As String
Dim i As Integer
Dim nPos As Long
Dim nStart As Long
Dim nLen As Integer
Dim nTestChar As Long
Dim nUCase As Boolean
nText = Text
For i = 0 To UBound(Pairs) - 1 Step 2
nLen = Len(Pairs(i))
nStart = 1
Do
nPos = InStr(nStart, nText, Pairs(i))
If nPos Then
nTestChar = Asc(Mid$(nText, nPos + nLen, 1))
If IsCharAlpha(nTestChar) Then
If IsCharUpper(nTestChar) Then
nUCase = True
End If
Else
nTestChar = Asc(Mid$(nText, nPos - 1, 1))
If IsCharAlpha(nTestChar) Then
If IsCharUpper(nTestChar) Then
nUCase = True
End If
Else
UCase = True
End If
End If
If nUCase Then
nText = Left$(nText, nPos - 1) & UCase$(Pairs(i + 1)) _
& Mid$(nText, nPos + nLen)
Else
nText = Left$(nText, nPos - 1) & Pairs(i + 1) _
& Mid$(nText, nPos + nLen)
End If
nStart = nPos + Len(Pairs(i + 1))
Else
Exit Do
End If
Loop
Next 'i
ConvertChars = nText
End Function
Diese Funktion greift auf die beiden API-Funktion IsCharAlpha
(siehe auch "Alpha(numerisch)
oder nicht?") und IsCharUpper
zurück. Mit IsCharAlpha wird zunächst geprüft, ob das auf das zu
tauschende Zeichen nachfolgende Zeichen ein Buchstabe ist, um diesen
nun wieder mit IsCharUpper hin auf Großschreibung hin zu prüfen.
Ist nämlich der nachfolgende Buchstabe ein Großbuchstabe, hat auch
die Ausschreibung des Umlauts in Großbuchstaben zu erfolgen, da mit
größter Wahrscheinlichkeit das ganze Wort in Großbuchstaben
geschrieben ist. Für den Fall, dass das nachfolgende Zeichen kein
auf Großschreibung prüfbarer Buchstabe sein sollte, wird das
vorhergehende Zeichen geprüft (Mir fällt allerdings auf Anhieb nur
ein einziges deutsches "Wort" ein, das mit einem Umlaut
endet, nämlich das Kutscherkommando "Hü" - kennen Sie
vielleicht noch andere?). Sollte ein Großbuchstaben-Umlaut solo
stehen (warum auch immer...), wird er natürlich auch komplett in
Großbuchstaben ausgeschrieben.
An den Rückwärtsgang sollten Sie allerdings keinen Gedanken
verschwenden. Ohne Nachschlage-Wörterbuch und intelligente
Kontext-Analyse dürfte es nämlich unmöglich sein, die
Rückwandlung von "MASSEN" in Maßen und nicht in Massen
zu bewerkstelligen, und die im Qücksilber laürnden Gefahren haben
mit Pösie wohl nur recht wenig zu tun... |