Prüfungen ob ASCII
Peter Mairhofer
- javascript
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
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
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
[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ü,
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
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
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.