Peter Mairhofer: Prüfungen ob ASCII

Hi!

Ich habe einen Counter für eine Textarea gebaut (zählt einfach die Zeichen und zeigt die Anzahl in einem Feld an):

function textCounter(field, countfield, maxlimit)
{
        if(field.value.length > maxlimit)
                field.value = field.value.substring(0, maxlimit);
        else
                countfield.value = maxlimit - field.value.length;
}

Der String 'öäü' wird nun als 3 Zeichen gezählt.

Serverseitig wird das Zeug aber als UTF8 gespeichert und in PHP ergibt ein strlen also 6 Zeichen.

Gibt es eine portable Möglichkeit, nicht ASCII Zeichen als 2 zu zählen? Oder dem Problem irgendwie anders Herr zu werden?

lg
Peter

  1. Hi,

    Der String 'öäü' wird nun als 3 Zeichen gezählt.

    Serverseitig wird das Zeug aber als UTF8 gespeichert und in PHP ergibt ein strlen also 6 Zeichen.

    Gibt es eine portable Möglichkeit, nicht ASCII Zeichen als 2 zu zählen? Oder dem Problem irgendwie anders Herr zu werden?

    Welchen Problems denn eigentlich?
    Bisher hast du kein Wort darueber verloren, an welcher Stelle das ganze ein echtes Problem darstellt.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Der String 'öäü' wird nun als 3 Zeichen gezählt.

      Serverseitig wird das Zeug aber als UTF8 gespeichert und in PHP ergibt ein strlen also 6 Zeichen.

      Gibt es eine portable Möglichkeit, nicht ASCII Zeichen als 2 zu zählen? Oder dem Problem irgendwie anders Herr zu werden?

      Welchen Problems denn eigentlich?
      Bisher hast du kein Wort darueber verloren, an welcher Stelle das ganze ein echtes Problem darstellt.

      Also was ich will: ASCII Zeichen als 1 zählen, den Rest als 2.

      Nebensächlich ist das Problem: Der User soll *genau* 200 Zeichen eingeben können. Das wird mit PHP serverseitig mit strlen geprüft und dann in mySQL5 in ein VARCHAR(200) geschrieben.

      Dabei handelt es sich aber um UTF8 Kodierung wo Umlaute 2 Bytes benötigen.

      D.h. serverseitig wird öäü als 6 gezählt, clientseitig (zumindest bei mir) als 3. Nachdem ich einfach nur 200 Bytes Platz habe (VARCHAR(200)) möchte ich alle nicht ASCII Zeichen als 2 zählen!

      Jetzt klar?

      lg
      Peter

      1. [latex]Mae  govannen![/latex]

        Also was ich will: ASCII Zeichen als 1 zählen, den Rest als 2.

        Nebensächlich ist das Problem: Der User soll *genau* 200 Zeichen eingeben können. Das wird mit PHP serverseitig mit strlen geprüft und dann in mySQL5 in ein VARCHAR(200) geschrieben.

        Dabei handelt es sich aber um UTF8 Kodierung wo Umlaute 2 Bytes benötigen.

        D.h. serverseitig wird öäü als 6 gezählt, clientseitig (zumindest bei mir) als 3. Nachdem ich einfach nur 200 Bytes Platz habe (VARCHAR(200)) möchte ich alle nicht ASCII Zeichen als 2 zählen!

        Du weißt aber, daß bestimmte Zeichen in UTF-8 auch _mehr_ als 2Byte belegen können?
        http://de.wikipedia.org/wiki/UTF-8 Falls jemand ein solches eingibt, bist du ggf. wieder oberhalb.

        Das müßtest du beachten oder die Eingabe auf ein Subset bestimmter Zeichen beschränken.

        Cü,

        Kai

        --
        Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
        selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
        Mein Selfhtml-Kram
      2. Hi,

        Also was ich will: ASCII Zeichen als 1 zählen, den Rest als 2.

        dann hast du ein systematisches Problem. Zeichen mit Codes ab U+0080 werden in Unicode nicht pauschal mit zwei, sondern mit bis zu vier Bytes codiert.

        Nebensächlich ist das Problem: Der User soll *genau* 200 Zeichen eingeben können. Das wird mit PHP serverseitig mit strlen geprüft und dann in mySQL5 in ein VARCHAR(200) geschrieben.

        Also 200 Zeichen. Warum klammerst du dich dann so an die 200 Bytes? Ich gehe davon aus, dass die Codierung dieses Feldes in der Datenbank ebenfalls UTF-8 ist.

        Dabei handelt es sich aber um UTF8 Kodierung wo Umlaute 2 Bytes benötigen.

        Und andere Sonderzeichen noch mehr. Na und? Trotzdem gilt es als je ein Zeichen.

        D.h. serverseitig wird öäü als 6 gezählt, ...

        Aber nur von PHP. Abgesehen davon: PHP kennt auch mbstrlen(), das zählt tatsächlich Zeichen und nicht einfach nur Bytes.

        Jetzt klar?

        Ja. Nur nicht, warum du ein Problem siehst.

        So long,
         Martin

        --
        Keine Sorge, wir finden für jede Lösung ein Problem.
        1. Hallo,

          bevor ein Erbsenzähler kommt, mach' ich es selbst:

          dann hast du ein systematisches Problem. Zeichen mit Codes ab U+0080 werden in Unicode nicht pauschal mit zwei, sondern mit bis zu vier Bytes codiert.

          soll heißen: [...] werden in UTF-8 nicht pauschal mit zwei, sondern mit bis zu vier Bytes codiert.

          Ciao,
           Martin

          --
          Paradox ist, wenn jemand eingefleischter Vegetarier ist.
      3. Hallo,

        Nebensächlich ist das Problem: Der User soll *genau* 200 Zeichen eingeben können. Das wird mit PHP serverseitig mit strlen geprüft und dann in mySQL5 in ein VARCHAR(200) geschrieben.

        Wo ist das Problem? Wenn Du die Spalte, wie es sich gehört, mit dem CHARSET UTF8 angelegt hast, dann kannst Du bis zu 200 UTF-8-Zeichen in dieser Spalte speichern - gleichgültig, wieviele Bytes diese belegen [1]. Ja, es ist auch möglich, eine 200-Zeichen-lange Zeichenkette, die nur aus den Zeichen ÄÖÜäöüß besteht, zu speichern.

        siehe dazu http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html.

        Freundliche Grüße

        Vinzenz

        [1] Eine Ausnahme sind Vier-Byte-UTF-8-Zeichen, die von MySQL (noch) nicht unterstützt werden.