# Bitte um Hilfe bei Zeichenzähler Erweiterung



## tge (26. Dez 2020)

Hallo Liebe Community,

ich habe hier einen Code der die Zeichen zählt, der funktioniert auch super


```
function countChar(val) {
      var len = val.value.length;
      if (len >= 401) {
          val.value = val.value.substring(0, 400);
      } else {
          $('#charNum').text(400 - len);
      }
  };
```

ich habe ein Formular das zum Beispiel beim Titel (maxlength="13") ist und meiner Datenbank wird ein Umlaut als zwei Zeichen hinterlegt
In der Datenbank wird das Wort "Zeichenzähler" so "ZeichenzÃ¤hler" hinterlegt und damit ist die Länge schon bei 14 Zeichen und dann kommt die Fehlermeldung "Nicht 13 Zeichen überschreiten"

Also sprich ich brauche eine erweiterung des Codes damit die Umlaute (Ü,Ö,Ä,ü,ö,ä,ß) doppelt gezählt werden

Da ich in Javascript nicht so fit bin (Grünschnabel) bitte ich euch Liebe Community um Hilfe.


----------



## LimDul (26. Dez 2020)

Das ist Javascript und kein Java. Und ich würde lieber die DB anpassen, da sie 13 Zeichen kann und nicht 13 Byte. Den ein Umlaut ist auch nur ein Zeichen, aber je nach Kodierung 2 Byte.


----------



## tge (26. Dez 2020)

LimDul hat gesagt.:


> Das ist Javascript und kein Java. Und ich würde lieber die DB anpassen, da sie 13 Zeichen kann und nicht 13 Byte. Den ein Umlaut ist auch nur ein Zeichen, aber je nach Kodierung 2 Byte.


Gibt es für diesen Javascript Code eine Lösung?

Ich habe das gefunden


```
sonderzeichen = val.match(/[^a-z A-Z0-9]/g);
//Buchstaben und Zahlen sind keine "Sonderzeichen"
 
if (sonderzeichen) {
  anz -= sonderzeichen.length;
  anz += (sonderzeichen.length * 2);
}
```

ich weiß nur nicht ob und wie das damit funktioniert


----------



## kneitzel (26. Dez 2020)

Also generell:

```
anz -= sonderzeichen.length;
  anz += (sonderzeichen.length * 2);
```
halte ich für schlechten Code. Du ziehst erst etwas ab um dann das doppelte hinzu zu fügen?

```
anz += sonderzeichen.length;
```
Dürfte doch das gleiche Ergebnis bringen...


----------



## tge (26. Dez 2020)

kneitzel hat gesagt.:


> Also generell:
> 
> ```
> anz -= sonderzeichen.length;
> ...


Gibt es für diesen Javascript Code eine Lösung? Was wäre ein guter Code?


----------



## kneitzel (26. Dez 2020)

Also die Verbesserung dieser zwei Zeilen habe ich Dir ja schon gegeben, denn a - x + x*2 = a + x.

Was ansonsten den Code angeht werde ich dir nicht weiter helfen können, denn ich mache sehr wenig mit JavaScript und das ganze Problem erscheint mir mehr wie dubios.

Was für ein Feld hast Du denn in der Datenbank definiert und welche Datenbank nutzt du überhaupt? Hast Du da VARCHAR oder CHAR als Datentyp statt NVARCHAR / NCHAR? Oder was treibst Du da überhaupt genau? Ich denke, dass das Problem bereits im Ansatz zu finden ist. Wenn Du Zeichen incl. Umlaute speichern willst, dann solltest Du den entsprechenden Datentyp nutzen und dann klappt auch die Zählung der Zeichen.

Und wenn du die Umlaute nicht zulassen willst, dann lasse sie auch nicht zu.


----------



## tge (26. Dez 2020)

kneitzel hat gesagt.:


> Also die Verbesserung dieser zwei Zeilen habe ich Dir ja schon gegeben, denn a - x + x*2 = a + x.
> 
> Was ansonsten den Code angeht werde ich dir nicht weiter helfen können, denn ich mache sehr wenig mit JavaScript und das ganze Problem erscheint mir mehr wie dubios.
> 
> ...


Ich habe VARCHAR, CHAR könnte ich noch wahlen, NVARCHAR habe ich nicht zur auswahl


----------



## kneitzel (26. Dez 2020)

Was für eine Datenbank nutzt du denn?


----------



## tge (26. Dez 2020)

kneitzel hat gesagt.:


> Was für eine Datenbank nutzt du denn?


PhpMyAdmin


----------



## kneitzel (26. Dez 2020)

Das PhpMyAdmin ist nur das Frontend, mit dem Du auf die Datenbank zugreifst? Also nutzt Du MySQL oder MariaDB.

Da ist VARCHAR ein Synonym für NVARCHAR, spricht: Da gibt es kein NVARCHAR.

Da ist aber die Frage, woher das kommt mit der doppelten Zählung. Wenn der Umlaut selbst als z.B. "Ã¤"ankommt, dann deutet das darauf hin, dass Du da ein Problem mit der Kodierung hast. Wie greifst Du denn aus JavaScript auf die Datenbank zu? Da wird es hoffentlich auch sowas wie PreparedStatements geben und so? 

Derzeit scheinst Du da auf jeden Fall lediglich Symptome zu bekämpfen statt der eigentlichen Ursache.


----------



## tge (26. Dez 2020)

kneitzel hat gesagt.:


> Das PhpMyAdmin ist nur das Frontend, mit dem Du auf die Datenbank zugreifst? Also nutzt Du MySQL oder MariaDB.
> 
> Da ist VARCHAR ein Synonym für NVARCHAR, spricht: Da gibt es kein NVARCHAR.
> 
> ...


Das JavaScript greift überhaut nicht auf die Datenbank, das macht die php, das JavaScript soll beim zählen der Zeichen helfen
Ich habe ein Verzeichnis und eine Vorgabe an Zeichen für den Titel und Beschreibung


----------



## LimDul (26. Dez 2020)

tge hat gesagt.:


> Das JavaScript greift überhaut nicht auf die Datenbank, das macht die php, das JavaScript soll beim zählen der Zeichen helfen
> Ich habe ein Verzeichnis und eine Vorgabe an Zeichen für den Titel und Beschreibung


Ein Ä ist aber ein Zeichen und nicht zwei. Es kann je nach Kodierung mal mehr und mal weniger Byte in Anspruch nehmen. Es gibt sogar Zeichen die in der UTF-8 Kodierung mehr als zwei Byte in Anspruch nehmen.

Das Problem liegt - wie @kneitzel schon sagt an der Datenbank Verbindung. Entweder der Zeichensatz in der DB ist falsch eingestellt oder das PHP Skript baut Grütze.


----------



## kneitzel (26. Dez 2020)

tge hat gesagt.:


> Das JavaScript greift überhaut nicht auf die Datenbank, das macht die php, das JavaScript soll beim zählen der Zeichen helfen
> Ich habe ein Verzeichnis und eine Vorgabe an Zeichen für den Titel und Beschreibung


Also egal wo und an welcher Stelle:
Strings werden intern als Bytes gespeichert. Welche Bytes für welches Zeichen verwendet werden, nennt sich Encoding. Du nutzt irgendwie zwei Encodings. Wenn Du das Programm Notepad++ nutzen solltest (Setzt ein Windows System voraus), dann kannst Du das spielerisch ausprobieren:
Einfach ein Dokument erstellen, Umlaute reintippen und dann die Kodierung ändern. Also von ANSI zu UTF8 und zurück. Wichtig: Kodierung ändern über den direkten Menüpunkt - nicht über "Konvertiere zu ..."

Ob das nun auf dem Weg vom Browser -> Server, eine Problematik auf dem Server beim Übergang Apache (oder was auch immer) -> PHP oder dann von PHP hin zur Datenbank: Das ist mir egal. Meine erste Vermutung war, dass es an der Datenbank hätte liegen können. Das hätte ich aber gleich wissen müssen, denn Du hast die falsche Kodierung ja schon direkt erwähnt gehabt. Aber bei anderen Datenbanken gibt es die Unterscheidung zwischen VARCHAR und NVARCHAR (z.B, bei MS SQL oder Oracle - da natürlich NVARCHAR2), denn NVARCHAR ist da explizit die Unicode Variante.

Das Nette ist dabei, dass diese Problematik nicht einmal groß auffällt (Außer bei der Länge), denn auf dem Rückweg machst Du den Fehler erneut und damit sieht es korrekt aus. Aber das ändert nichts daran, dass Du in der Datenbank schlicht falsche Daten schreibst. Das ist aus meiner Sicht ein absolutes NO GO. Daten sind eine Art Kapital von Firmen, Zerhau die Daten und du zerhaust die Firma! Klar - das kann unkritische Daten treffen und falsch gespeicherte Umlaute werden ggf. auch niemanden zu sehr interessieren.... Aber wer weiß, wo du morgen zuschlägst. Vielleicht bei der Buchführung Zahlen in ihrer Codierung verdrehen (kriegt man das irgendwie mit einfachen Mitteln überhaupt hin? Wäre mal interessant ... also so Richtung Big Endian / Little Endian Vertauschung ... )


----------

