Discussion:
Zeichen Zählen: Sonderzeichen und Umlaute
(zu alt für eine Antwort)
Oliver Meister
2005-05-24 11:49:54 UTC
Permalink
Guten Tag Miteinander

Ich habe ein Script, das zählt Zeichen aus dem Textfeld.
Pro Buchstabe oder Zahl erhöht sich der Zähler um eins.
Funktioniert wunderbar - ist auch nichts neues.

Mein Problem ist nun, dass ich die GENAUE Zeichenlänge für UTF8
zählen will.
Z.B ist ein Umlaut (ä,ö,ü) 2 Zeichen gross.

Hat jemand eine Idee wie ich die Zeichen konvertieren/ zählen kann?

Gruss
Oliver
Martin Honnen
2005-05-24 12:26:29 UTC
Permalink
Post by Oliver Meister
Ich habe ein Script, das zählt Zeichen aus dem Textfeld.
Pro Buchstabe oder Zahl erhöht sich der Zähler um eins.
Funktioniert wunderbar - ist auch nichts neues.
Mein Problem ist nun, dass ich die GENAUE Zeichenlänge für UTF8
zählen will.
Z.B ist ein Umlaut (ä,ö,ü) 2 Zeichen gross.
Das ist nicht richtig, ein Umlaut ist ein Zeichen wie jeder andere
Buchstabe oder jedes andere Symbol auch. UTF-8 kodiert Zeichen als
Bytesequenz und fuer einen Umlaut werden in UTF-8 zwei Bytes verwendet,
und das eine Zeichen zu kodieren.
Post by Oliver Meister
Hat jemand eine Idee wie ich die Zeichen konvertieren/ zählen kann?
Dazu muesste man eine Zeichenkette per UTF-8-Kodierung in eine
Bytesequenz umwandeln und die Anzahl der Bytes in der Sequenz zaehlen.
--
Martin Honnen
http://JavaScript.FAQTs.com/
Martin Honnen
2005-05-24 13:02:40 UTC
Permalink
Post by Martin Honnen
Post by Oliver Meister
Hat jemand eine Idee wie ich die Zeichen konvertieren/ zählen kann?
Dazu muesste man eine Zeichenkette per UTF-8-Kodierung in eine
Bytesequenz umwandeln und die Anzahl der Bytes in der Sequenz zaehlen.
So ich bei schnellem Ueberfliegen des Unicodestandards und der dortigen
Erklaerung der UTF-8-Kodierung das jetzt richtig verstanden habe, laesst
sich die Laenge so bestimmen:

String.prototype.getUTF8ByteSequenceLength = function () {
var length = 0;
for (var i = 0; i < this.length; i++) {
var codePoint = this.charCodeAt(i);
if (codePoint <= 0x7F) {
length += 1;
}
else if (codePoint > 0x7F && codePoint < 0x800) {
length += 2;
}
else if (codePoint >= 0x800 && codePoint <= 0xFFFF) {
length += 3;
}
else if (codePoint > 0xFFFF) {
length += 4;
}
}
return length;
}


var s = 'a1ä€';
alert(s.getUTF8ByteSequenceLength()); // shows 7
--
Martin Honnen
http://JavaScript.FAQTs.com/
Oliver Meister
2005-05-24 13:10:02 UTC
Permalink
Hallo Martin

das ist genau das was ich Suche! Bin beeindruckt *verbeug* - ich noob
hätte das wohl in 100 Jahren nicht hinbekommen. :-) ... in JavaScript.

Jetzt muss ich nur noch nachgucken gehen was codePoint und Prototype
macht... :-)

Vielen Dank für Deine Hilfe.

Oliver
Dietmar Meier
2005-05-24 13:39:22 UTC
Permalink
String.prototype.getUTF8ByteSequenceLength = function () { [...]
Etwas kompakter:

String.prototype.getUTF8ByteSequenceLength = function () {
for (var i = 0, l = 0; i < this.length; i++) {
var c = this.charCodeAt(i);
l += 1 + (c > 0x7F) + (c > 0x7FF) + (c > 0xFFFF);
}
return l;
}

ciao, dhgm

Loading...