Sonderzeichen und Umlaute ersetzen

  • Heyho,

    schreib grad eine Funktion die alle Sonderzeichen und Umlaute in einem String ersetzen soll, leider funktioniert dies aber noch nicht wirklich wie gewünscht. Ich habe wie folgt angefangen:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $sString = "Míke"
    Local $aChars[42][2] = [['Ä','Ae'], _
    ['Ö','Oe'], _
    ['Ü','Ue'], _
    ['ä','ae'], _
    ['ö','oe'], _
    ['ü','ue'], _
    ['Â','A'], _
    ['À','A'], _
    ['Á','A'], _
    ['â','a'], _
    ['á','a'], _
    ['à','a'], _
    ['Ê','E'], _
    ['È','E'], _
    ['É','E'], _
    ['ê','e'], _
    ['é','e'], _
    ['è','e'], _
    ['Î','I'], _
    ['Ì','I'], _
    ['Í','I'], _
    ['î','i'], _
    ['í','i'], _
    ['ì','i'], _
    ['Ô','O'], _
    ['Ò','O'], _
    ['Ó','O'], _
    ['ô','o'], _
    ['ó','o'], _
    ['ò','o'], _
    ['Û','U'], _
    ['Ù','U'], _
    ['Ú','U'], _
    ['û','U'], _
    ['ú','U'], _
    ['ù','U'], _
    [',',''], _
    ['.',''], _
    ['-',''], _
    ['/',''], _
    ['\',''], _
    ['_','']]

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aChars) - 1 Step 1
    Local $aTest = StringRegExpReplace($sString, $aChars[$i][0], $aChars[$i][1])
    Next
    ConsoleWrite($sString & @CR)

    [/autoit]

    Aber das i mit Sonderzeichen wird leider nicht ausgetauscht. Ich habe mal gehört in C prüft man auf Sonderzeichen durch den Dezimalwert der ASCII-Tabelle. Geht sowas in AutoIt auch? Hat jemand einen Tipp für mich?

    Grüße

    Edit Oscar: Spoiler-Tags hinzugefügt!

    Grüße Yaerox

    Grüne Hölle

    Einmal editiert, zuletzt von Oscar (17. Februar 2015 um 09:25)

  • Du verwendest die Funktion StringRegExpReplace nicht korrekt soweit ich es erkennen kann:
    Die Funktion gibt kein Array zurück, also macht die ungarische Notation bei "$aTest" keinen Sinn.
    $sString wird in der For Schleife kein einziges Mal verändert. Der Inhalt bleibt gleich weil StringRegExpReplace gar nicht auf die Variable zugreift (das würde nicht mal funktionieren), StringRegExpReplace gibt den bearbeiteten String zurück, also musst du diesen Wert $sString zuweisen wenn du einen Effekt sehen willst.
    Das Local Statement vor deiner Variable macht auf 2 Arten keinen Sinn. Erstens kannst du keine lokale Variable außerhalb einer Funktion deklarieren. Zweitens haben Deklarationen nichts in Schleifen verloren (einmal reicht ;)).

    Zitat

    Ich habe mal gehört in C prüft man auf Sonderzeichen durch den Dezimalwert der ASCII-Tabelle. Geht sowas in AutoIt auch? Hat jemand einen Tipp für mich?

    Das kann man machen, aber es bringt relativ wenig.

  • Zeile 50:
    Welchen nutzen hat das, wenn du die Variable abrufst die du zuvor in Zeile 3 deklaiert hast?
    Du veränderst nicht den Inhalt der Variable...

    In Zeile 48 (sprich Variable $aTest) wird dein Ergebnis gespeichert!


    €dit:
    Wenn du die Funktion "Chr()" verwendest und die ASCII Tabelle zu hilfe nimmst, kannst du das auch auf "nummern" prüfen...

    Einmal editiert, zuletzt von Yjuq (6. März 2013 um 23:00)

  • Ohh mein Gott, war gestern schon relativ müde und seh jetzt auch was ich da für n Mist geschrieben habe 8|

    Naja habe es mal ein wenig bearbeitet, funktioniert nun.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Local $sString = "M.í/k\é-P_ât,r'íck,Güntèr"
    Local $aChars[43][2] = [['Ä','Ae'], _
    ['Ö','Oe'], _
    ['Ü','Ue'], _
    ['ä','ae'], _
    ['ö','oe'], _
    ['ü','ue'], _
    ['Â','A'], _
    ['À','A'], _
    ['Á','A'], _
    ['â','a'], _
    ['á','a'], _
    ['à','a'], _
    ['Ê','E'], _
    ['È','E'], _
    ['É','E'], _
    ['ê','e'], _
    ['é','e'], _
    ['è','e'], _
    ['Î','I'], _
    ['Ì','I'], _
    ['Í','I'], _
    ['î','i'], _
    ['í','i'], _
    ['ì','i'], _
    ['Ô','O'], _
    ['Ò','O'], _
    ['Ó','O'], _
    ['ô','o'], _
    ['ó','o'], _
    ['ò','o'], _
    ['Û','U'], _
    ['Ù','U'], _
    ['Ú','U'], _
    ['û','U'], _
    ['ú','U'], _
    ['ù','U'], _
    ['\_',''], _ ; _
    ['\\',''], _ ; \
    ['\/',''], _ ; /
    ['\.',''], _ ; .
    ['\-',''], _ ; -
    ['\,',''], _ ; ,
    ["\'",'']] ; '

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aChars) - 1 Step 1
    If StringRegExp($sString, $aChars[$i][0]) = 1 Then $sString = StringRegExpReplace($sString, $aChars[$i][0], $aChars[$i][1])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite($sString & @CR)

    [/autoit]

    Grüße Yaerox

    Grüne Hölle

    2 Mal editiert, zuletzt von Yaerox (7. März 2013 um 11:19)

  • Wieso nicht einfach mit StringReplace?

    [autoit]

    For $i = 0 To UBound($aChars) - 1
    $sString = StringReplace($sString,$aChars[$i][0], $aChars[$i][1])
    Next

    [/autoit]

    Es ist mMn. einfacher im Gebrauch, und wie Celeri aus'm englischen Forum mal festgestellt hat auch schneller.

  • Wieso nicht einfach mit StringReplace?

    [autoit]

    For $i = 0 To UBound($aChars) - 1
    $sString = StringReplace($sString,$aChars[$i][0], $aChars[$i][1])
    Next

    [/autoit]

    Es ist mMn. einfacher im Gebrauch, und wie Celeri aus'm englischen Forum mal festgestellt hat auch schneller.

    Hey wenn ich die Zeilen so austausche, dann verwandelt er aber wenn ein kleines Sonderzeichen wie ü in Mitte des Wortes ist nicht in ue sondern in Ue. Der holt einfach das was er als erstes mit ü oder Ü in der Array findet.
    Wie kann ich das umgehen?

    • Offizieller Beitrag

    Um ein paar Codezeilen einzusparen und mit einem eindimensionalen Array:

    [autoit]


    Local $sString = "Míke"
    Local $sChars = "ÄAe|ÖOe|ÜUe|äae|öoe|üue|ÂA|ÀA|ÁA|âa|áa|àa|ÊE|ÈE|ÉE|êe|ée|èe|ÎI|ÌI|ÍI|îi|íi|ìi|ÔO|ÒO|ÓO|ôo|óo|òo|ÛU|ÙU|ÚU|ûU|úU|ùU|,|.|-|/|\|_"
    Local $aChars = StringSplit($sChars, "|", 2)
    For $i = 0 To UBound($aChars) - 1
    $sString = StringReplace($sString, StringLeft($aChars[$i], 1), StringMid($aChars[$i], 2), 0, 1)
    Next
    ConsoleWrite($sString & @CR)

    [/autoit]
  • Na Oscar.
    Wenn schon optimieren, dann aber richtig ;-):

    [autoit]

    Local $sString = "Míke"
    For $i In StringSplit("ÄAe|ÖOe|ÜUe|äae|öoe|üue|ÂA|ÀA|ÁA|âa|áa|àa|ÊE|ÈE|ÉE|êe|ée|èe|ÎI|ÌI|ÍI|îi|íi|ìi|ÔO|ÒO|ÓO|ôo|óo|òo|ÛU|ÙU|ÚU|ûU|úU|ùU|,|.|-|/|\|_", "|", 2)
    $sString = StringReplace($sString, StringLeft($i, 1), StringTrimLeft($i, 1), 0, 1)
    Next
    ConsoleWrite($sString & @CR)

    [/autoit]
  • Na Oscar.
    Wenn schon optimieren, dann aber richtig ;-):

    [autoit]

    Local $sString = "Míke"
    For $i In StringSplit("ÄAe|ÖOe|ÜUe|äae|öoe|üue|ÂA|ÀA|ÁA|âa|áa|àa|ÊE|ÈE|ÉE|êe|ée|èe|ÎI|ÌI|ÍI|îi|íi|ìi|ÔO|ÒO|ÓO|ôo|óo|òo|ÛU|ÙU|ÚU|ûU|úU|ùU|,|.|-|/|\|_", "|", 2)
    $sString = StringReplace($sString, StringLeft($i, 1), StringTrimLeft($i, 1), 0, 1)
    Next
    ConsoleWrite($sString & @CR)

    [/autoit]

    Jetzt mal eine Frage dazu
    wie würde das bei so was aussehen, krieg das irgendwie nicht gekürzt zum laufen?

    [autoit]


    $Name = StringReplace($Name, 'ß', "ss",0,1)
    $Name = StringReplace($Name, 'Ü', "Ue",0,1)
    $Name = StringReplace($Name, 'Ä', 'Ae',0,1)
    $Name = StringReplace($Name, 'Ö', 'Oe',0,1)
    $Name = StringReplace($Name, 'ü', "ue",0,1)
    $Name = StringReplace($Name, 'ä', "ae",0,1)
    $Name = StringReplace($Name, 'ö', "oe",0,1)
    $Name = StringReplace($Name, '&Uuml;', "Ue",0,1)
    $Name = StringReplace($Name, '&uuml;', "ue",0,1)
    $Name = StringReplace($Name, '&ouml;', "oe",0,1)
    $Name = StringReplace($Name, '&Ouml;', "Oe",0,1)
    $Name = StringReplace($Name, '&auml;', "ae",0,1)
    $Name = StringReplace($Name, '&Auml;', "Ae",0,1)
    $Name = StringReplace($Name, '&szlig;', "ss",0,1)

    [/autoit]

    Ist es auch bei mehr Zeichen wie hierbei mit | diesen Strichen zu lösen?

  • Wenn es unbedingt in der selben kompakten Form sein soll, dann z.B. so:

    [autoit]

    Local $sString = "M&uuml;cke"
    For $i In StringSplit("ß#ss|Ãœ#Ue|Ä#Ae|Ö#Oe|ü#ue|ä#ae|ö#oe|&Uuml;#Ue|&uuml;#ue|&ouml;#oe|&Ouml;#Oe|&auml;#ae|&Auml;#Ae|&szlig#ss|Ä#Ae|Ö#Oe|Ü#Ue|ä#ae|ö#oe|ü#ue|Â#A|À#A|Á#A|â#a|á#a|à#a|Ê#E|È#E|É#E|ê#e|é#e|è#e|Î#I|Ì#I|Í#I|î#i|í#i|ì#i|Ô#O|Ò#O|Ó#O|ô#o|ó#o|ò#o|Û#U|Ù#U|Ú#U|û#U|ú#U|ù#U|,#|.#|-#|/#|\#|_#", "|", 2)
    $sString = StringReplace($sString, StringLeft($i, StringInStr($i, "#", 1)-1), StringTrimleft($i, StringInStr($i, "#", 1)), 0, 1)
    Next
    ConsoleWrite($sString & @CR)

    [/autoit]
  • Supergut! AspirinJunkie du bist einer meiner Textverarbeitungshelden. Bei gefühlt jedem zweiten Beitrag von dir, lerne ich etwas dazu :)
    Ich bedaure weiterhin, dass es keinen Bedanken-Button gibt..

    Ich möchte noch anmerken, dass AspirinJunkies Variante auch zuverlässiger ist. Bei mir führten StringReplace Wiederholungen nach dem sechsten, siebten Mal (+-5 ;) ) immer zu Fehlern und ich bin dazu übergegangen, nach einigen StringReplace eine neue Variable zu füllen.
    Ungefähr so:
    $Name = StringReplace($Name, 'ä', "ae",0,1)
    $Name2 = StringReplace($Name, 'ö', "oe",0,1)
    $Name2 = StringReplace($Name2, '&Uuml;', "Ue",0,1)

    Hat funktioniert. Ist aber eher nicht die eleganteste Lösung, nicht wahr? :D

    Grüße autoiter

  • Die Variante mag zwar schön kompakt sein, aber für eine produktive Verwendung durchaus etwas unübersichtlich.
    Für die Konvertierung der HTML-Entitäten verwende ich persönlich stattdessen folgende Funktion:

    Konvertiere HTML-Entitäten
    [autoit]

    Local $sString = "M&uuml;&#x63;k&#x65;"

    [/autoit] [autoit][/autoit] [autoit]

    _ConvertEntities($sString)
    ConsoleWrite($sString & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _ConvertEntities()
    ; Description ...: Wandelt HTML-Entitäten in einem Quellcode in ihre entsprechenden Zeichen
    ; Syntax ........: _ConvertEntities($sURL)
    ; Parameters ....: $sURL - String in welchem die Entitäten umgewandelt werden sollen
    ; Return values .: nichts (String wird direkt verändert)
    ; Remarks .......: Escaping wird nicht beachtet!
    ; Author ........: AspirinJunkie
    ; =================================================================================================
    Func _ConvertEntities(ByRef $s_S)
    Local $o_Dict = ObjCreate("Scripting.Dictionary")
    Local $a_RegExp, $s_T
    Local Static $a_NameEnt[][2] = [["quot", 34],["amp", 38],["apos", 39],["lt", 60],["gt", 62],["quot", 34],["amp", 38],["apos", 39],["lt", 60],["gt", 62],["nbsp", 160], _
    ["iexcl", 161],["cent", 162],["pound", 163],["curren", 164],["yen", 165],["brvbar", 166],["sect", 167],["uml", 168],["copy", 169], _
    ["ordf", 170],["laquo", 171],["not", 172],["reg", 174],["macr", 175],["deg", 176],["plusmn", 177],["sup2", 178],["sup3", 179], _
    ["acute", 180],["micro", 181],["para", 182],["middot", 183],["cedil", 184],["sup1", 185],["ordm", 186],["raquo", 187], _
    ["frac14", 188],["frac12", 189],["frac34", 190],["iquest", 191],["Agrave", 192],["Aacute", 193],["Acirc", 194],["Atilde", 195], _
    ["Auml", 196],["Aring", 197],["AElig", 198],["Ccedil", 199],["Egrave", 200],["Eacute", 201],["Ecirc", 202],["Euml", 203], _
    ["Igrave", 204],["Iacute", 205],["Icirc", 206],["Iuml", 207],["ETH", 208],["Ntilde", 209],["Ograve", 210],["Oacute", 211], _
    ["Ocirc", 212],["Otilde", 213],["Ouml", 214],["times", 215],["Oslash", 216],["Ugrave", 217],["Uacute", 218],["Ucirc", 219], _
    ["Uuml", 220],["Yacute", 221],["THORN", 222],["szlig", 223],["agrave", 224],["aacute", 225],["acirc", 226],["atilde", 227], _
    ["auml", 228],["aring", 229],["aelig", 230],["ccedil", 231],["egrave", 232],["eacute", 233],["ecirc", 234],["euml", 235], _
    ["igrave", 236],["iacute", 237],["icirc", 238],["iuml", 239],["eth", 240],["ntilde", 241],["ograve", 242],["oacute", 243],["ocirc", 244], _
    ["otilde", 245],["ouml", 246],["divide", 247],["oslash", 248],["ugrave", 249],["uacute", 250],["ucirc", 251],["uuml", 252],["yacute", 253], _
    ["thorn", 254],["yuml", 255],["OElig", 338],["oelig", 339],["Scaron", 352],["scaron", 353],["Yuml", 376],["fnof", 402],["circ", 710], _
    ["tilde", 732],["Alpha", 913],["Beta", 914],["Gamma", 915],["Delta", 916],["Epsilon", 917],["Zeta", 918],["Eta", 919],["Theta", 920], _
    ["Iota", 921],["Kappa", 922],["Lambda", 923],["Mu", 924],["Nu", 925],["Xi", 926],["Omicron", 927],["Pi", 928],["Rho", 929],["Sigma", 931], _
    ["Tau", 932],["Upsilon", 933],["Phi", 934],["Chi", 935],["Psi", 936],["Omega", 937],["alpha", 945],["beta", 946],["gamma", 947], _
    ["delta", 948],["epsilon", 949],["zeta", 950],["eta", 951],["theta", 952],["iota", 953],["kappa", 954],["lambda", 955],["mu", 956], _
    ["nu", 957],["xi", 958],["omicron", 959],["pi", 960],["rho", 961],["sigmaf", 962],["sigma", 963],["tau", 964],["upsilon", 965], _
    ["phi", 966],["chi", 967],["psi", 968],["omega", 969],["thetasym", 977],["upsih", 978],["piv", 982],["ensp", 8194], _
    ["emsp", 8195],["thinsp", 8201],["ndash", 8211],["mdash", 8212],["lsquo", 8216],["rsquo", 8217],["sbquo", 8218], _
    ["ldquo", 8220],["rdquo", 8221],["bdquo", 8222],["dagger", 8224],["Dagger", 8225],["bull", 8226],["hellip", 8230], _
    ["permil", 8240],["prime", 8242],["Prime", 8243],["lsaquo", 8249],["rsaquo", 8250],["oline", 8254],["frasl", 8260], _
    ["euro", 8364],["image", 8465],["weierp", 8472],["real", 8476],["trade", 8482],["alefsym", 8501],["larr", 8592], _
    ["uarr", 8593],["rarr", 8594],["darr", 8595],["harr", 8596],["crarr", 8629],["lArr", 8656],["uArr", 8657],["rArr", 8658], _
    ["dArr", 8659],["hArr", 8660],["forall", 8704],["part", 8706],["exist", 8707],["empty", 8709],["nabla", 8711],["isin", 8712], _
    ["notin", 8713],["ni", 8715],["prod", 8719],["sum", 8721],["minus", 8722],["lowast", 8727],["radic", 8730],["prop", 8733],["infin", 8734], _
    ["ang", 8736],["and", 8743],["or", 8744],["cap", 8745],["cup", 8746],["int", 8747],["there4", 8756],["sim", 8764],["cong", 8773], _
    ["asymp", 8776],["ne", 8800],["equiv", 8801],["le", 8804],["ge", 8805],["sub", 8834],["sup", 8835],["nsub", 8836],["sube", 8838], _
    ["supe", 8839],["oplus", 8853],["otimes", 8855],["perp", 8869],["sdot", 8901],["lceil", 8968],["rceil", 8969],["lfloor", 8970],["rfloor", 8971], _
    ["lang", 10216],["rang", 10217],["loz", 9674],["spades", 9824],["clubs", 9827],["hearts", 9829],["diams", 9830]]

    [/autoit] [autoit][/autoit] [autoit]

    ; Dezimalform:
    $a_RegExp = StringRegExp($s_S, "&#(\d{2,4});", 3)
    If IsArray($a_RegExp) And Not @error Then
    For $i In $a_RegExp
    If Not $o_Dict.Exists("&#" & $i & ";") Then $o_Dict.Add("&#" & $i & ";", Int($i))
    Next
    EndIf
    ; Hexadezimalform:
    $a_RegExp = StringRegExp($s_S, "&#x([[:xdigit:]]{2,4});", 3)
    If IsArray($a_RegExp) And Not @error Then
    For $i In $a_RegExp
    If Not $o_Dict.Exists("&#x" & $i & ";") Then $o_Dict.Add("&#x" & $i & ";", Dec($i))
    Next
    EndIf
    ; Namensform:
    For $i = 0 To UBound($a_NameEnt) - 1
    $s_T = "&" & $a_NameEnt[$i][0] & ";"
    If StringInStr($s_S, $s_T, 1) Then
    If Not $o_Dict.Exists($s_T) Then $o_Dict.Add($s_T, $a_NameEnt[$i][1])
    EndIf
    Next
    ; Ersetze die Codes durch ihr entsprechendes Zeichen:
    For $i In $o_Dict.Keys
    $s_S = StringReplace($s_S, $i, ChrW($o_Dict($i)), 0, 1)
    Next
    EndFunc ;==>_ConvertEntities

    [/autoit]

    Bei mir führten StringReplace Wiederholungen [...] immer zu Fehlern und ich bin dazu übergegangen, nach einigen StringReplace eine neue Variable zu füllen.

    Vielleicht ist die Reihenfolge der Ersetzungen so unglücklich, dass zwischendurch neue scheinbare Entitäten entstehen?
    Mal zum testen immer den aktuellen bearbeiteten String als Zwischenergebnis ausgeben lassen um zu schauen wie der Fehler entsteht.

  • Erst einmal danke für die Funktion! :D

    Möglich, dass es einfach eine unglückliche Reihenfolge war. Das werde ich mir mal ansehen. Jedenfalls klingt das plausibel.

    Grüße autoiter