Felix Riesterer: Varianten von Buchstaben/Sonderzeichen "normalisieren"

Liebe Spezialisten,

ich möchte für mein Kreuzworträtsel einen Mechanismus implementieren, der sicherstellt, dass jegliche Eingabe eines Benutzers garantiert in Großbuchstaben umgewandelt werden, egal welche "Variante" eines solchen eingegeben wurden. Um das zu verdeutlichen ein paar Beispiele:

a -> A
A -> A
á -> A
Á -> A
à -> A
À -> A
ä -> A
Ä -> A
â -> A
 -> A

und so weiter. Da mir der passende Suchbegriff fehlt (ich habe es mit "normalisieren" hier versucht), habe ich keine fertige Funktion gefunden... bisher jedenfalls nicht.

Ich vermute, dass das ein riesiges Array/Objekt mit vielen Sonderzeichen-Notierungen (wie z.B. \u00fc für ü) erfordert, welches mir die vielen Sonderzeichen in meine Buchstaben umwandelt. Also in etwa so:

var codeTabelle = {  
    A : new Array(  
        \u0065, // a  
        \u0097, // A  
        \u0192, // À  
        \u0193, // Á  
        \u0194, // Â  
        \u0195, // Ã  
        \u0196, // Ä  
        \u0197, // Å  
        \u0224, // à  
        \u0225, // á  
        \u0226, // â  
        \u0227, // ã  
        \u0228, // ä  
        \u0229 // å  
    ),  
    B : new Array(...)  
}

Ligaturen (wie z.B. Æ) habe ich jetzt bewusst erst einmal außen vor gelassen.

Nun meine Frage: Hat jemand etwas Ähnliches bereits gesehen/benutzt oder davon gewusst? Ich möchte mir - wenn es geht - das Suchen und Sortieren der vielen Mutationen der diversen (Englischen?) Zeichen ersparen... und wenn es nur der Einsatz eines PHP-Scripts ist, welches mir eine solche Code-Tabelle generieren könnte.

Wer kann mir raten/weiterhelfen?

Liebe Grüße aus Ellwangen,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  1. Du könntest auch String.charCodeAt() verwenden und dementsprechend abfragen, in etwa so:

      
    for (var c=0... ) {  
    var zeichen = input.charCodeAt(c)  
    if (zeichen > ... && zeichen < ...) { return 'A'; }  
    }  
    
    

    Gruß, LX

    --
    X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
    1. Liebe(r) LX,

      for (var c=0... ) {
      var zeichen = input.charCodeAt(c)
      if (zeichen > ... && zeichen < ...) { return 'A'; }
      }

        
      und wie soll ich das dann für den Rest des Alphabets machen? Ich will garnicht an die vielen Slawischen Konsonanten denken...  
        
      Falls jemand das schon einmal gemacht hätte, wäre ich um die Code-Tabelle sehr dankbar, zumal ich ja Ligaturen demnächst auch noch in zwei Zeichen auftrennen möchte. Aber wie es im Moment aussieht, werde ich diese Code-Tabelle von Hand erstellen müssen, denn nichteinmal so Geschichten wie die PHP-Funktionen [metaphone()](http://de.php.net/manual/en/function.metaphone.php) oder [soundex()](http://de.php.net/manual/en/function.soundex.php) bringen mich hier viel weiter... :-(  
        
      Liebe Grüße aus [Ellwangen](http://www.ellwangen.de/),  
        
      Felix Riesterer.
      
      -- 
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      
      1. Hallo!
        Ich weiß jetzt nicht ob ich dein Problem richtig verstanden habe aber wenn du einfach nur sicherstellen willst, dass alles im Uppercase ist, warum verwendest du dann nicht einfach toUpperCase()?
        Ich nehm halt jetzt an, dass du JS verwendest wegen der angeführten Notation.

        <script type="text/javascript">  
        var c = 'à';  
        alert(c + " " + c.toUpperCase());  
        </script>
        

        Das funktionniert bei mir wunderbar.

        --
        LG,
        Snafu
        1. Ich weiß jetzt nicht ob ich dein Problem richtig verstanden habe...

          Nein hast du nicht, es geht darum wie man à und á und _ä_hnliches in normale westliche Buchstaben umwandelt.

          --
          ie:% fl:| br:^ va:} ls:& fo:| rl:( n4:( ss:| de:] js:| ch:? sh:( mo:| zu:)
  2. Hello,

    schwieriges und doch eigentlich relativ naheliegendes Thema. Vielleicht kann dir Unicode normalization einen Einstieg geben.
    Java bietet eine Unterstützung bespielsweise in Form der Collator-Klasse an.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    When the only tool you've got is a hammer, all problems start to look like nails.
    1. Lieber Rouven,

      Vielleicht kann dir Unicode normalization einen Einstieg geben.

      DAS ist das Schlüsselwort! Genau das brauche ich.

      Java bietet eine Unterstützung bespielsweise in Form der Collator-Klasse an.

      Hmm. Ich bräuchte das für JavaScript... und da mein Script unter der LGPL steht, sollte dei Lizenz einer solche Klasse auch damit kompatibel sein.

      Danke für das Such-Futter. Jetzt kann ich weiter searchen. :-)

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Hmm.

        Ich sehe schon, ich bekomme keine schöne einfache JavaScript-Funktion, die mir das alles abnimmt. Ich bekomme auch keine Code-Tabelle für meinen Zweck.

        Ergo werde ich mir das alles in Handarbeit selbst basteln müssen - schade!

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. (Hallo|Hi(ho)|Nabend) Felix Riesterer,

          Ich sehe schon, ich bekomme keine schöne einfache JavaScript-Funktion, die mir das alles abnimmt. Ich bekomme auch keine Code-Tabelle für meinen Zweck.

          Diverse CM- und Blog-Systeme haben lustige Funktionen eingebaut, die einen Text (meist eine eingegebene Überschrift) so in eine Teil-URL umwandeln können, dass möglichst viel (ASCII-)Klartext übrigbleibt. Die meisten Funktionen dieser Art gehen sehr radikal mit den Texten um und wandeln bspw. ein Ä nicht, wie man es beim Stichwort Transliteration erwarten würde, in AE, sondern in ein schlichtes A um.

          http://www.google.co.uk/search?hl=de&q=url+transliteration+table

          Ergo werde ich mir das alles in Handarbeit selbst basteln müssen - schade!

          MffG
          EisFuX

          1. Lieber EisFuX,

            Danke für den Hinweis. Ich habe das alles jetzt in Handarbeit erledigt und für meine Bedürfnisse auf eine zunächst zufriedenstellende Art gelöst.

            Liebe Grüße aus Ellwangen,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  3. Hi Felix,

    ich weiss nicht ob ich richtig liege, aber würde folgender Pseudocode nicht reichen?
    !$in [A-Za-z] ? Error : Ucase($in)

    A.

  4. So. Ich habe das Problem in Handarbeit gelöst. Es ist keine universale Lösung, sondern nur eine Lösung für meinen konkreten Anwendungsfall. Wer sich das anschauen möchte, darf das gerne: utf8-normalizer.js

    Das veränderte Kreuzworträtsel (auf dessen Eingabemethode ich einigermaßen stolz bin), in dem diese Umwandlung zum Tragen kommt, ist hier zu bewundern: Quiz-Demoseite

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)