Strings zu TUF-8 konvertieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Strings zu TUF-8 konvertieren

    Hi,

    Ich suche ein Code-Schnipsel dass einen String beliebigen Encodings zu UTF-8 machen kann. Jemand sowas in der Richtung schon mal gesehen? Mb_convert_encoding() tut's nicht so, da es einen String der bereits UTF-8 ist nochmal zu UTF-8, also totalen Hickhack draus macht... .

    MfG

    Luke

  • #2
    Für "komme was da wolle" gibt es keine Patentlösung. Ein String ist auch nur eine Ansammlung von Nullen und Einsen. Du mußt wissen, wie der String kodiert ist, um genau das wieder zu bekommen, was der "Erzeuger" geschrieben hat - ihr müßt die Nullen und Einsen gleich intepretieren.

    Wenn du weißt, wie er kodiert ist, liegt auf der Hand, wie er zu dekodieren ist. Weißt du es nicht, kannst du nur raten und schauen, ob etwas sinnvolles herauskommt.

    Kommentar


    • #3
      Es ist möglich; ich hab schon diverse Ansätze gefunden. Bestimmte Zeichenabfolgen kommen wohl nur in bestimmten Encodings vor... stell ich mir so vor.

      Ich kann speziefischer sein: Ich möchte GET-parameter automatisch in UTF-8 umwandeln. Ich weiß dass es möglich ist, die Wikipedia hat's auch geschafft.

      Kommentar


      • #4
        Original geschrieben von Luke
        Es ist möglich; ich hab schon diverse Ansätze gefunden. Bestimmte Zeichenabfolgen kommen wohl nur in bestimmten Encodings vor... stell ich mir so vor.
        Unwahrscheinlich, aber mag schon sein. Doch solange es mindestens zwei Strings gibt, die unterschiedlich kodiert die gleiche Zeichenfolge enthalten, geht es schief. In diesem einen Fall weißt du nicht, wie du dekodieren sollst.
        Ich kann speziefischer sein: Ich möchte GET-parameter automatisch in UTF-8 umwandeln. Ich weiß dass es möglich ist, die Wikipedia hat's auch geschafft.
        Wo, hast du mal ein Beispiel (Link)?

        Kommentar


        • #5
          Beispiel: Umwandlung von Ö nach "windows-1252"-charset ist %D6 (kommt wenn ich in meinem Browser (Win2K - Firefox) DÖner eingebe) Geh mal zur Wikipedia und häng ein %F6 in die (Wiki-)URL.

          Vergleich:
          http://efwiki.sourceforge.net/wiki/index.php?D%F6ner
          http://de.wikipedia.org/wiki/D%F6ner

          ---------------------------

          Ich hab aber auch schon einen guten Ansatz gefunden (http://www2.uiah.fi/~joorava/charset/detect.php). Es funktioniert so dass ein bestimmtes Sonderzeichen per POST mitgeschickt wird, an dessen Kodierung kann dann der Datensatz herausgefunden werden... ziemlich genial

          Kommentar


          • #6
            Die oben angegebene Lösung ist nicht optimal, hat jemand noch ne idee? Oder kapiert vielleicht jemand den Code im mediawiki/includes/normal/ verzeichnis?


            MfG Luke

            Kommentar


            • #7
              Aprospos Möglichkeit zu erkennung von ChracterEncodings: mb_detect_encoding(). Leider funktioniert das nicht für mich, da er immer das PHPinterne Encoding (also UTF-8/ASCII) erkennt (und nicht wie gewollt das vom User im GET benutzte Encoding)

              Ließe sich aber vielleicht auch was draus machen... wenn jemand ne Idee hat?

              Kommentar


              • #8
                mb_http_input()?
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  Funktioniert nicht, lieftert immer nen leeren String

                  Kommentar


                  • #10
                    Aber ich denke ich hab's geknackt...

                    http://efwiki.sourceforge.net/wiki/index.php?Döner
                    Zuletzt geändert von Luke; 03.04.2006, 21:27.

                    Kommentar


                    • #11
                      Also: Ich möchte für mein Wiki URLs auf UTF-8 normalisieren, also dass unabhängig vom Charset des Users die URL und besonders dessen GET Parameter immer in UTF-8 ist (damit Wikiseiten immer den gleichen Namen haben und es nicht ein mal die Seite D%F6ner (ISO-8859-1) und einmal die Seite D%C3%B6ner (UTF-8) gibt). Das ganze funktioniert relativ hick-hackig:

                      PHP-Code:
                      # Wikiseitentitel aus der URL extrahieren (index.php?Seitenname&weitereparameter)
                      $querystring explode('&'getenv('QUERY_STRING'));
                      $_WIKIGLOBALS['pagename'] = $querystring[0];

                      if(!
                      is_utf8(urldecode($_WIKIGLOBALS['pagename'])))
                      {
                          if(empty(
                      $_GET['CharEncDetectStr']))
                          {
                              
                      #Wenn der Seitentitel nicht UTF-8 ist wird ein bestimmtes Sonderzeichen an die URL gehängt
                              
                      header ("location: redirect.php?".getenv('QUERY_STRING')."&CharEncDetectStr=œ");
                          } else {
                              
                      # Anhand dieses Sonderzeichens wird das encoding des Clients erkannt.
                              # Anhand dessen wird der Seitentitel dann convertiert
                              
                      $url urlencode(mb_convert_encoding(urldecode($_WIKIGLOBALS['pagename']), 'UTF-8',
                                           
                      detect_charset(urldecode($_GET['CharEncDetectStr']))));
                              
                      # Die weiteren Parameter der URL werden dann wieder mit dem umgewandelten Seitentitel
                              # (Zeile oben) zu einer neuen (UTF-8 kompatiblen) URL zusammengefügt, das Sonderzeichen
                              # wird wieder entfernt
                              
                      for($i=1$i<count($querystring)-1$i++)
                              {
                                  
                      $url .= '&'.$querystring[$i];
                              }
                              
                      # weiterleitung zur neuen UTF-8 kompatiblen URL
                              
                      header ("location: redirect.php?".$url);
                          }
                      } else {
                          
                      header('Content-Type: text/html; charset=utf-8');
                          echo 
                      'UTF-8 kompatibel! Seitentitel: '.urldecode($_WIKIGLOBALS['pagename']);
                      }


                      function 
                      detect_charset($oe) {
                               if (
                      strpos($oe"\xC5\x93") !== FALSE$charset 'UTF-8';
                          else if (
                      strpos($oe"\xCF") !== FALSE$charset 'x-mac-roman';
                          else if (
                      strpos($oe"\xBD") !== FALSE$charset 'ISO-8859-15';
                          else if (
                      strpos($oe"\x9C") !== FALSE$charset 'windows-1252';
                          
                      //    else if (strpos($oe, "\xB4") !== FALSE) $charset = 'ISO-8859-1';    // ??
                          
                      else                                    $charset '';
                          
                          return 
                      $charset;
                      }

                      function 
                      is_utf8($string) {
                        
                         return 
                      preg_match('%^(?:
                               [\x09\x0A\x0D\x20-\x7E]            # ASCII
                             | [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
                             |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
                             | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
                             |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
                             |  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
                             | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
                             |  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
                         )*$%xs'
                      $string);
                        

                      Ha Wikipedia! 900 Zeilen(!) Code weniger und IE-Kompabilität!
                      Zuletzt geändert von Luke; 03.04.2006, 17:48.

                      Kommentar

                      Lädt...
                      X