# Charset CharToByteRate



## Nightmares (19. Aug 2011)

Hallo,

ich entwickel momentan meine JAVA NIO Plattform weiter. Diese ist auch voll funktionsfähig und kann im Punkto Performence mit anderen mithalten / diese sogar teilweise übertrumpfen. Allerdings stehe ich vor einem kleinen Problem bei der Implementierung eines weiteren, neuen, einfach zu benutzten Protokolls: Um ein beliebiges Charset vom Benutzer wählen lassen zu können muss ich irgentwie die !höchste Rate von Char zu Byte bestimmen können. Sicher ich könnte einfach solange die BufferOverflowException abfangen und den ByteBuffer um 10% vergrößern, bis er groß genug ist um den nächsten Schwung zu fassen. Allerdings ist das ja nicht optimal da es auch um Performence geht. UTF8 zum Beispiel hat eine andere CharToByte Rate als ISO-xxx-xx zum Beispiel. Bei UTF8 ist es zum Beispiel bis zu 4 Byte. Bei einem ISO-xxx-xx ist es nur 1 Byte. Meine Idee war einfach die Länge des Strings mal CharToByteRate und ab damit... Allerdings bin ich nach längeren suchen und lesen der APInoch nicht fündig geworden. Und einfach Overkill mit 8 Byte was glaube ich atm das größte ist find ich auch nicht so toll. Ram-Probleme enstehen dabei nicht, weil der Buffer der die Daten später zwischenspeichert sowieso nur Daten enthält und auf diese Länge gekürzt wird.
Das Problem ist also heraus zu finden, wieviel Bytes das jeweilige Charset pro Char maximal braucht...


----------



## Nightmares (23. Aug 2011)

Nach weiterem Suchen und Fragen habe ich bisher immer noch nichts gefunden. Deshalb der mega Hammer: 8 Byte für jeden Char... ist vielleicht nicht ganz 100% das Effektivste aber immer noch schnell / weniger Ram intensiv als alles andere (incl. Versuche heraus zu finden wie viele Bytes pro Char in einem Charset maximal verwendet werden, weil man sich da auch je nach System nicht drauf verlassen kann, leider... da gibt es wohl eine Bugs und Plattform spezifischen Abweichungen...)


----------



## Nightmares (10. Sep 2011)

Hallo nochmal,

durch Zufall habe ich jetzt doch noch eine Lösung für das Problem gefunden:
Der CharsetEncoder selber hat eine Methode names .maxBytesPerChar() welche genau die Antwort auf meine Frage gibt und damit die Speichernutzung noch etwas verringert und die Effizienz steigert und außerdem für jedes Charset passend den Wert bestimmen kann.

```
CharsetEncoder cenc = charset.newEncoder();
int mbpc = cenc.maxBytesPerChar();
```


----------

