Es gibt noch einiges mehr zu ersetzen, gerade bei dir in der Gegend sind doch auch die exotischen Buchstaben möglich
Code
Ersetzen:
- "SCH" = "Y"
- "ß" = "SS"
- "Ä,Æ" = "AE"
- "Ö,Œ" = "OE"
- "Ü" = "UE"
Bei Zeichen, die ein Diakritikum wie Akut, Gravis, Zirkumflex, Tilde, Kroužek, Cedille,
Trema (außer bei deutschen Umlauten), Schrägstrich oder Hatschek enthalten,
wird dieses Zeichen durch den Basisbuchstaben ersetzt.
- "À,Á,Â,Ã,Å" = "A"
- "Ç" = "C"
- "È,É,Ê,Ë" = "E"
- "Ì,Í,Î,Ï" = "I"
- "Ð" = "D"
- "Ñ" = "N"
- "Ò,Ó,Ô" = "O"
- "Ù,Ú,Û" = "U"
- "Ý" = "Y"
Alles anzeigen
EDIT:
Für die "Sonderbuchstaben" ist noch einiges zu beachten:
- die nativen String-Funktionen können damit nicht immer korrekt umgehen, da sie diese als Kombination zweier Zeichen sehen (Problem bei StringSplit, StringLen, StringMid)
- StringUpper() ist nicht anwendbar (gilt ebenso für deutsche Umlaute)
Ich habe deshalb mal eine Funktion erstellt die das beim Ersetzen berücksichtigt. Einfach mit Name oder Vorname aufrufen (oder auch beides zusammen, wenn keine Namenszusätze oder Bindenamen vorhanden sind):
EDIT_2:
Habe nun noch eine kpl. Umsetzung erstellt, inkl. Prüfziffer:
AutoIt
$sFullName = 'Thomas Schmidt'
$sGebDat = '17.11.1959'
;~ $sFullName = 'Hans-Peter von Müller zu Oberhausen'
;~ $sGebDat = '1.1.1978'
ConsoleWrite( _Get_eTIN($sFullName, $sGebDat) & @CRLF)
Func _Get_eTIN($_sFullName, $_sGebDat)
Local $aRet = _SplitFullName($_sFullName)
Local $Name = _ConvertName( _ReplaceInName( $aRet[1] ) )
Local $Vname = _ConvertName( _ReplaceInName( $aRet[0] ) )
Local $Geb = _ConvertDate( $_sGebDat )
Local $sConvert = StringFormat('%s%s%s', $Name, $Vname, $Geb)
Local $Check = _GetCheckValue( $sConvert )
Return $sConvert & $Check
EndFunc
Func _SplitFullName($_sName)
Local Static $a[] = [' von ',' van ',' v. ',' auf ',' dos ',' des ',' del ',' da ',' de ',' do ',' di ',' d ',' la ',' le ',' lo ']
Local $iSplitPos, $iPos = StringInStr($_sName, ' zu ')
If $iPos <> 0 Then ; 'zu' enthalten
$iSplitPos = StringInStr($_sName, ' ', 0, -1, $iPos-1)
Else
For $i = 0 To UBound($a) -1
$iPos = StringInStr($_sName, $a[$i])
If $iPos Then ExitLoop
Next
If $iPos Then
$iSplitPos = $iPos
Else
$iSplitPos = StringInStr($_sName, ' ', 0, -1)
EndIf
EndIf
Local $aRet[] = [StringLeft($_sName, $iSplitPos-1), StringTrimLeft($_sName, $iSplitPos)]
Return $aRet ; [VName,Name (mit evtl. Zusatz voran)]
EndFunc
Func _ReplaceInName($sName)
Local Static $aReplace[58][2] = [['SCH','Y'],['ß','SS'],['ä','AE'],['Ä','AE'],['æ','AE'], _
['Æ','AE'],['ö','OE'],['Ö','OE'],['œ','OE'],['Œ','OE'],['ü','UE'],['Ü','UE'],['à','A'], _
['á','A'],['â','A'],['ã','A'],['å','A'],['À','A'],['Á','A'],['Â','A'],['Ã','A'],['Å','A'], _
['ç','C'],['Ç','C'],['è','E'],['é','E'],['ê','E'],['ë','E'],['È','E'],['É','E'],['Ê','E'], _
['Ë','E'],['ì','I'],['í','I'],['î','I'],['ï','I'],['Ì','I'],['Í','I'],['Î','I'],['Ï','I'], _
['ð','D'],['Ð','D'],['ñ','N'],['Ñ','N'],['ò','O'],['ó','O'],['ô','O'],['Ò','O'],['Ó','O'], _
['Ô','O'],['ù','U'],['ú','U'],['û','U'],['Ù','U'],['Ú','U'],['Û','U'],['ý','Y'],['Ý','Y']]
$sName = StringUpper($sName)
For $i = 0 To UBound($aReplace) -1
$sName = StringReplace($sName, $aReplace[$i][0], $aReplace[$i][1])
Next
Return $sName
EndFunc
Func _ConvertName($sName)
Local Static $aDel[] = ['ZU ','VON ','VAN ','V. ','AUF ','DOS ','DES ','DEL ', _
'DA ','DE ','DO ','DI ','D ','LA ','LE ','LO ','-',' ']
Local $sReturn = ''
; Zusätze, Leerzeichen, Bindestriche löschen
For $i = 0 To UBound($aDel) -1
$sName = StringReplace($sName, $aDel[$i], '')
Next
; ersten 4 Konsonanten suchen
Local $aName = StringSplit($sName, ''), $iCons = 0
For $i = 1 To $aName[0]
If $iCons = 4 Then ExitLoop
If Not StringInStr('AEIOU', $aName[$i]) Then
$iCons += 1
$sReturn &= $aName[$i]
EndIf
Next
; wenn zu kurz mit Vokalen (vom letzten Vokal beginnend) auffüllen
If StringLen($sReturn) < 4 Then
For $i = $aName[0] To 1 Step -1
If StringInStr('AEIOU', $aName[$i]) Then
$sReturn &= $aName[$i]
If StringLen($sReturn) = 4 Then ExitLoop
EndIf
Next
EndIf
; wenn noch zu kurz mit 'X' auffüllen
While StringLen($sReturn) < 4
$sReturn &= 'X'
WEnd
Return $sReturn
EndFunc
Func _ConvertDate($sDate)
Local $aDate = StringRegExp($sDate, '(\d{1,2})\.(\d{1,2})\.(\d{4})', 3)
Local $sYY = StringRight(String($aDate[2]), 2)
Local $sM = Chr(Int($aDate[1])+64)
Local $sDD = StringFormat('%02d', $aDate[0])
Return StringFormat('%s%s%s', $sYY, $sM, $sDD)
EndFunc
Func _GetCheckValue($sConverted)
Local Static $aValue[][3] = [[0,1,'A'],[0,1,'0'],[1,0,'B'],[1,0,'1'],[2,5,'C'],[2,5,'2'], _
[3,7,'D'],[3,7,'3'],[4,9,'E'],[4,9,'4'],[5,13,'F'],[5,13,'5'],[6,15,'G'],[6,15,'6'],[7,17,'H'], _
[7,17,'7'],[8,19,'I'],[8,19,'8'],[9,21,'J'],[9,21,'9'],[10,2,'K'],[11,4,'L'],[12,18,'M'], _
[13,20,'N'],[14,11,'O'],[15,3,'P'],[16,6,'Q'],[17,8,'R'],[18,12,'S'],[19,14,'T'],[20,16,'U'], _
[21,10,'V'],[22,22,'W'],[23,23,'X'],[24,24,'Y'],[25,25,'Z']]
Local $iSum = 0
For $i = 1 To StringLen($sConverted)
For $j = 0 To UBound($aValue) -1
If $aValue[$j][2] = StringMid($sConverted, $i, 1) Then
$iSum += $aValue[$j][Mod($i,2)]
ExitLoop
EndIf
Next
Next
Return Chr(Mod($iSum,26)+65)
EndFunc
Alles anzeigen