Linuchs: Silbentrennung in der Datenbank (unsichtbarer Zwischenraum)

Hallo,

heute stoße ich auf eine Veranstaltung, die im Titel das Wort "Informationsveranstaltung" hat. Dieses Wort ist als Überschrift <h1> so lang, dass es beim Smartphone hochkant nicht vollständig zu sehen ist und einen Scrollbalken produziert.

Habe das Wort mit Trennzeichen &shy; versehen, aber statt zu trennen, werden diese fünf Zeichen angezeigt. Vollkommen korrekt, weil diese Zeichen ja so in die Datenbank eingegeben und bei der Ausgabe nach HTML konvertiert wurden.

Doch wie kann ich das Thema Trennungseichen behandeln, wenn es vom HTML Formular in die Datenbank und wieder zur HTML Ausgabe geht?

Irgend ein "geheimes" Zeichen, dass normalerweise von HTML nicht angezeigt, aber per PHP Programm zu &shy; gemacht werden kann?

Da gab es doch mal (oder gibt es noch) so einen unsichtbaren Zwischenraum, auf den ich mal gestoßen bin, weil ein @ in einer Mail-Adresse damit umkleidet war und die Mailadresse für Bots also ungültig machte.

Der Zwischenraum ist bei der Schriftfamilie Monospace zu sehen (z.B. im Editor), bei sans-serif nicht. Wie heisst dieses Zeichen?

Linuchs

  1. Tach!

    Irgend ein "geheimes" Zeichen, dass normalerweise von HTML nicht angezeigt, aber per PHP Programm zu &shy; gemacht werden kann?

    &shy; ist nur ein Entity für das Zeichen 0xAD, welches auch direkt verwendet werden kann. Allerdings sieht man es nicht in den Daten, genauso wie man ein Leerzeichen 0x20 nicht von geschütztem Leerzeichen 0xA0 unterscheiden kann.

    Da gab es doch mal (oder gibt es noch) so einen unsichtbaren Zwischenraum, auf den ich mal gestoßen bin, weil ein @ in einer Mail-Adresse damit umkleidet war und die Mailadresse für Bots also ungültig machte.

    Unterm Stichwort „Leerzeichen“ in der Wikipedia findet man sie alle aufgelistet.

    dedlfix.

  2. Hallo

    heute stoße ich auf eine Veranstaltung, die im Titel das Wort "Informationsveranstaltung" hat. Dieses Wort ist als Überschrift <h1> so lang, dass es beim Smartphone hochkant nicht vollständig zu sehen ist und einen Scrollbalken produziert.

    Also ein kosmetisches Problem.

    Da gab es doch mal (oder gibt es noch) so einen unsichtbaren Zwischenraum, auf den ich mal gestoßen bin, weil ein @ in einer Mail-Adresse damit umkleidet war und die Mailadresse für Bots also ungültig machte.

    Grundsätlich gibt es den nonbreaking space (&nbsp;), da der aber auch an anderer Stelle eingesetzt werden dürfte, könnte es dort zu Kollateralschäden kommen. Es gibt aber auch breitere und schmalere Leerzeichen, die du in normalen Texten eher selten oder garnicht einsetzen wirst. Wenn du z.B. für deine Zwecke den Zero-Width Space (&#8203;) missbrauchst, solltest du damit die gewünschten Umbrüche bei kuzen Zeilen hinbekommen.

    Tschö, Auge

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
    Terry Pratchett, "Wachen! Wachen!"
    ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
    1. Hallo

      Wenn du z.B. für deine Zwecke den Zero-Width Space (&#8203;) missbrauchst, solltest du damit die gewünschten Umbrüche bei kuzen Zeilen hinbekommen.

      Word Joiner (&#8288;) scheint passender zu sein.

      Beschreibung (Wikipedia):
      Wie U+200B [Zero-Width Space], und daher ebenfalls kein Whitespace-Zeichen, aber ohne Zeilenumbruch. Dieses Zeichen wurde in Unicode 3.2 eingeführt um die Funktion von U+FEFF als „Wortverbinder“ zu übernehmen.

      Tschö, Auge

      --
      Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
      Terry Pratchett, "Wachen! Wachen!"
      ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
      1. Hi,

        Wenn du z.B. für deine Zwecke den Zero-Width Space (&#8203;) missbrauchst, solltest du damit die gewünschten Umbrüche bei kuzen Zeilen hinbekommen.

        Word Joiner (&#8288;) scheint passender zu sein.

        Weder noch.

        Wenn das Wort zwisch
        en Silben ge
        trennt wird, dann will man doch
        wohl einen Binde
        strich. Sonst liest
        sich das ja ziem
        lich idiot
        isch.

        Ein Soft Hyphen ist also die richtige Wahl¹.

        ¹ Abgesehen von einigen veralteten Browsern auf Mobilgeräten, die damit nicht umgehen können (und dann nur irgendein Ersatszeichen anzeigen, so dass es „kaputt“ aussieht). Entweder drauf pfeifen, oder schauen wie man denen eine Alternative anbietet.

        MfG ChrisB

        --
        Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
        1. Hallo

          Wenn das Wort zwisch
          en Silben ge
          trennt wird, dann will man doch
          wohl einen Binde
          strich. Sonst liest
          sich das ja ziem
          lich idiot
          isch.

          Ein Soft Hyphen ist also die richtige Wahl¹.

          Wer sagt, dass die Trennung an den Silbengrenzen erfolgen müsste? ;-)

          Ich will auch mal:

          Oder man benut
          zt an allen mö
          glichen Ecken
          und Enden unnö
          tigerweise Bin
          destriche, auc
          h wenn sie nic
          ht gebraucht w
          ürden.

          Das sähe zwar be-scheu-ert aus und mich regt das je-des-mal auf, wenn ich das se-he, aber es stell-te sich-er (oder si-cher? … öhhm, ja), dass die Tren-nung ü-ber-all, wo sie not-wen-dig sein könn-te, auch er-fol-gen kann.

          ¹ Abgesehen von einigen veralteten Browsern auf Mobilgeräten, die damit nicht umgehen können (und dann nur irgendein Ersatszeichen anzeigen, so dass es „kaputt“ aussieht). Entweder drauf pfeifen, oder schauen wie man denen eine Alternative anbietet.

          Wenn ich es richtig verstanden habe, sind genau diese unfähigen Browser der Aufhänger für den Thread.

          Tschö, Auge

          --
          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
          Terry Pratchett, "Wachen! Wachen!"
          ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
        2. Hallo

          Jetzt hast du mich aber auf's Glatteis geführt. :-)

          Wenn du z.B. für deine Zwecke den Zero-Width Space (&#8203;) missbrauchst, solltest du damit die gewünschten Umbrüche bei kuzen Zeilen hinbekommen.

          Word Joiner (&#8288;) scheint passender zu sein.

          Weder noch.

          Ein Soft Hyphen ist also die richtige Wahl¹.

          Ja nee. Es geht nicht darum, die oben genannten Zeichen an den Browser auszugeben, sondern sie zur Speicherung einer Silbentrennung *in der Datenbank* zu missbrauchen. Dies, weil ein in der DB gespeichertes &shy; bei der kontextgerechten Maskierung des Textes mit htmlspecialchars bei der Ausgabe kaputtgeht. Um das zu umgehen, soll ein normalerweise nicht oder selten genutztes Zeichen in der DB stehen, dass nach htmlspecialchars durch &shy; ersetzt werden kann.

          Tschö, Auge

          --
          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
          Terry Pratchett, "Wachen! Wachen!"
          ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
          1. @@Auge:

            nuqneH

            Ein Soft Hyphen ist also die richtige Wahl¹.

            Ja nee. Es geht nicht darum, die oben genannten Zeichen an den Browser auszugeben, sondern sie zur Speicherung einer Silbentrennung *in der Datenbank* zu missbrauchen.

            Nei-en! Es geht daraum, nicht andere Zeichen zu mittbrauchen, sondern das richtige Zeichen U+00AD SOFT HYPHEN zu verwenden …

            Dies, weil ein in der DB gespeichertes &shy;

            … und zwar nicht HTML-escapet.

            soll ein normalerweise nicht oder selten genutztes Zeichen in der DB stehen, dass nach htmlspecialchars durch &shy; ersetzt werden kann.

            Nein, nicht irgendein anderes „normalerweise nicht oder selten genutztes“ Zeichen, sondern das richtige Zeichen: U+00AD SOFT HYPHEN.

            Qapla'

            --
            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
  3. @@Linuchs:

    nuqneH

    heute stoße ich auf eine Veranstaltung, die im Titel das Wort "Informationsveranstaltung" hat.

    Nenn es doch „Infoveranstaltung“! SCNR.

    Dieses Wort ist als Überschrift <h1> so lang, dass es beim Smartphone hochkant nicht vollständig zu sehen ist und einen Scrollbalken produziert.

    Vernünftige Browser beherrschen automatische Silbentrennung.

    Habe das Wort mit Trennzeichen &shy; versehen, aber statt zu trennen, werden diese fünf Zeichen angezeigt. Vollkommen korrekt, weil diese Zeichen ja so in die Datenbank eingegeben und bei der Ausgabe nach HTML konvertiert wurden.

    Vollkommen unkorrekt. HTML-Escapes wie &shy; haben in der Datenbank nichts zu suchen. Die Daten sollten hinsichtlich späterer Verwendung agnostisch sein. Möglicherweise braucht man die Daten ja auch für andere Zwecke als sie in den HTML-Kontext zu bringen.

    HTML-Escapes dürfen also erst dann ins Spiel kommen, wenn Daten tatsächlich in den HTML-Kontext gebracht werden. Nicht früher!

    Du kannst natürlich das Zeichen U+00AD SOFT HYPHEN als solches (d.h. nicht HTML-escapet) in deinen Daten verwenden. Wie du dieses eingibst, ist deine Sache. (Unicode-Tastaturtreiber?)

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. Vollkommen unkorrekt. HTML-Escapes wie &shy; haben in der Datenbank nichts zu suchen. Die Daten sollten hinsichtlich späterer Verwendung agnostisch sein. Möglicherweise braucht man die Daten ja auch für andere Zwecke als sie in den HTML-Kontext zu bringen.

      HTML-Escapes dürfen also erst dann ins Spiel kommen, wenn Daten tatsächlich in den HTML-Kontext gebracht werden. Nicht früher!

      Vollkommen einverstanden. Nur wie stelle ich ein Zeichen in den Text, das nur für HTML gebraucht wird?

      Es muss auf jeden Fall in der Datenbank "sichtbar" sein. Im KLartext: Mit phpmyadmin (ist aber auch wieder HTML).

      Um voranzukommen, nehme ich bei Eingabe und Speicherung in die DB das Zeichen | gemeinsam auf der Taste < > also In|for|ma|tions|ver|an|stal|tung

      Blöd ist, dass diese "Steuerzeichen" nun 7 Zeichen vom Text wegnehmen, der für eine Überschrift natürlich begrenzt ist.

      Die Ausgabe an Browser kann ich nun beliebig "interpretieren", z.B.:
      str_replace( "|", "&shy;", $row_trm['titel'] )

      Du kannst natürlich das Zeichen U+00AD SOFT HYPHEN als solches (d.h. nicht HTML-escapet) in deinen Daten verwenden. Wie du dieses eingibst, ist deine Sache. (Unicode-Tastaturtreiber?)

      Keine Ahnung, wie man dieses Zeichen codiert.
      str_replace( "|", "&#00AD;", $row_trm['titel'] )

      ergibt
      In�AD;for�AD;ma�AD;tions�AD;ver�AD;an�AD;stal�AD;tung

      Linuchs

      Qapla'

      1. Tach!

        HTML-Escapes dürfen also erst dann ins Spiel kommen, wenn Daten tatsächlich in den HTML-Kontext gebracht werden. Nicht früher!
        Vollkommen einverstanden. Nur wie stelle ich ein Zeichen in den Text, das nur für HTML gebraucht wird?

        So sollte man nicht an die Sache rangehen. Es ist nicht günstig, was anderes als Rohdaten zu speichern.

        Es muss auf jeden Fall in der Datenbank "sichtbar" sein.

        Am besten sollte so ein Zeichen gar nicht vorhanden sein, denn es bereitet genauso Probleme wie ausgabespezifische Umschreibungen von Zeichen. Man kann in solcherart angereicherten Daten nur noch schwer suchen. Und eine Veranstaltungsübersicht, die bestimmte Veranstaltungen nicht findet, nur weil die Suche nach Foobar am Foo|bar scheitert, ist nur bedingt brauchbar.

        Den Spagat zwischen Rohdaten und den gewünschten Zusatzinformationen bekommst du so einfach nicht hin. Da wird wohl noch ein Zusatzfeld mit einer durchsuchbaren Variante des Textes eingebaut werden müssen.

        Um voranzukommen, nehme ich bei Eingabe und Speicherung in die DB das Zeichen | gemeinsam auf der Taste < > also In|for|ma|tions|ver|an|stal|tung
        Blöd ist, dass diese "Steuerzeichen" nun 7 Zeichen vom Text wegnehmen, der für eine Überschrift natürlich begrenzt ist.

        &shy; hat noch mehr weggenommen. Wenn du Trennstelleninformationen ablegen willst, kommst du um einen Speicherverbrauch nicht umhin.

        Keine Ahnung, wie man dieses Zeichen codiert.

        Das Kodieren (z.B. in UTF-8) übernimmt das Programm, in das man es eingibt. Man gibt es ein, genauso wie man „typografische Anführungszeichen“ und andere nicht auf der Tastatur vorhandene Zeichen eingibt. Unter Windows beispielsweise kann man es mit Alt gedrückt halten und 0173 auf dem Ziffernfeld eingeben. Man sieht dabei nichts, man merkt nur, dass da was ist, weil der Cursor zweimal nach links oder rechts bewegt werden muss, um an dem Zeichen vorbeizukommen.

        dedlfix.

        1. Hallo dedlfix,

          Man kann in solcherart angereicherten Daten nur noch schwer suchen. Und eine Veranstaltungsübersicht, die bestimmte Veranstaltungen nicht findet, nur weil die Suche nach Foobar am Foo|bar scheitert, ist nur bedingt brauchbar.

          Habe ich noch gar nicht beachtet, ist ein k.o. Kriterium.

          Testweise habe ich nun vor der DB-Speicherung dieses gemacht:
          str_replace( "¬", chr("xAD"), trim( $_POST['titel'] ))

          Das Zeichen ¬ wurde bei Wikipedia genannt.

          Nun passiert bei der HTML-Ausgabe zunächst nichts. Das Zeichen ist nicht zu sehen und eine Silbentrennung erfolgt weder beim FF noch bei Opera.

          Allerdings - toller Trick gegen Einsehen des HTML-Codes - ab diesem Zeichen endet die Anzeige des Quelltextes bei Opera. FF zeigt im Quelltext
          In

          Uups- jetzt kann ich das mit Copy und Paste nicht hierhin übertragen.

          Bei der Anzeige des Soft Hyphens im Formularfeld ist anstelle des Soft Hyphens ein Kästchen zu sehen, mit Copy und Paste hierhin übertragen:
          In�for�ma�tions�ver�an�stal�tung

          Nach Absenden des Änderungsformulars - ohne dieses Feld zu ändern - wird das Wort in HTML dann mit den Fragezeichen ausggeben, also geht das Soft Hyphen verloren und ist damit auch technisch nicht zu gebrauchen.

          Ich speichere also bei Bedarf ein | (und nicht sieben) als Trennzeichen (wohl wisssend, dass mir das die Suchmöglichkeit versaut) und mache bei der HTML-Ausgabe ein &shy; davon.

          Linuchs
          Linuchs

      2. @@Linuchs:

        nuqneH

        Die Daten sollten hinsichtlich späterer Verwendung agnostisch sein. Möglicherweise braucht man die Daten ja auch für andere Zwecke als sie in den HTML-Kontext zu bringen.
        Vollkommen einverstanden. Nur wie stelle ich ein Zeichen in den Text, das nur für HTML gebraucht wird?

        ?? (Ein)verständnis sieht für mich anders aus.

        Es muss auf jeden Fall in der Datenbank "sichtbar" sein.

        ?? _In_ der Datenbank ist nichts sichtbar. Es wird sichtbar, wenn du es aus der Datenbank rausholst. Kannst du es dann durch htmlentities() jagen?

        Um voranzukommen, nehme ich bei Eingabe und Speicherung in die DB das Zeichen | gemeinsam auf der Taste < > also In|for|ma|tions|ver|an|stal|tung

        Blöd ist, dass diese "Steuerzeichen" nun 7 Zeichen vom Text wegnehmen, der für eine Überschrift natürlich begrenzt ist.

        Natürlich. Das tun 7 U+00AD SOFT HYPHEN genauso.

        str_replace( "|", "&shy;", $row_trm['titel'] )

        Keine Ahnung, wie man dieses Zeichen codiert.
        str_replace( "|", "&#00AD;", $row_trm['titel'] )

        Hexadezimal: &#xAD; (Die führenden Nullen braucht man nicht.)
                      ▲

        Für den HTML-Parser ist &shy; aber dasselbe wie &#xAD;. Für einen menschlichen Quellcode-Leser ist aber ersteres besser verständlich.

        Sinnvoller wäre es aber sicher, VOR dem Schreiben in die Datenbank '|' durch U+00AD SOFT HYPHEN (nicht durch HTML-Escapes) zu ersetzen.

        str_replace( "|", "\xAD;", $row_trm['titel'] )

        http://php.net/manual/de/regexp.reference.escape.php

        Qapla'

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
        1. Tach!

          Sinnvoller wäre es aber sicher, VOR dem Schreiben in die Datenbank '|' durch U+00AD SOFT HYPHEN (nicht durch HTML-Escapes) zu ersetzen.
          str_replace( "|", "\xAD;", $row_trm['titel'] )

          Das klappt so nur, wenn man mit ISO-8859-1 arbeitet, da hier das alte PHP-Leiden zuschlägt, nicht zeichen- sondern bytebasiert zu arbeiten. utf8encode() kann Abhilfe schaffen.

          dedlfix.

      3. Om nah hoo pez nyeetz, Linuchs!

        Um voranzukommen, nehme ich bei Eingabe und Speicherung in die DB das Zeichen | gemeinsam auf der Taste < > also In|for|ma|tions|ver|an|stal|tung

        Blöd ist, dass diese "Steuerzeichen" nun 7 Zeichen vom Text wegnehmen, der für eine Überschrift natürlich begrenzt ist.

        Ebenso blöd ist, dass du jetzt zwar noch nach „Informationsveranstaltung“ suchen kannst, aber nicht mehr fündig wirst.

        Matthias

        --
        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Tell und Teller.

    2. @@Gunnar Bittersmann:

      nuqneH

      heute stoße ich auf eine Veranstaltung, die im Titel das Wort "Informationsveranstaltung" hat.

      Nenn es doch „Infoveranstaltung“! SCNR.

      Nochmal drüber nachgedacht: Ich ziehe das SCNR zurück. So dumm ist die Idee nämlich gar nicht.

      <h1>  
        <span class="long">Informationsveranstaltung"</span>  
        <span class="short">Infoveranstaltung"</span>  
      <h1>
      
      h1 .long { display: none }  
        
      @media (min-width: 20em)  
      {  
        h1 .long  { display: inline }  
        h1 .short { display: none }  
      }
      

      Qapla'

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
  4. Hallo,

    Doch wie kann ich das Thema Trennungseichen behandeln, wenn es vom HTML Formular in die Datenbank und wieder zur HTML Ausgabe geht?

    Da wir in der Datenbank keine HTML-Entities speichern, nehmen wir die Bytesequenz für den Softhyphen. Diese Bytesequenz kannst Du mit pack("CC", 0xC2, 0xAD); erzeugen, die pack()-Funktion gibt es auch in PHP.

    Schöne Grüße, UvD ;)