¿Cuál es la forma más eficiente de calcular la longitud de bytes de un carácter, teniendo en cuenta la codificación de caracteres? La codificación solo se conocerá durante el tiempo de ejecución. En UTF-8, por ejemplo, los caracteres tienen una longitud de bytes variable, por lo que cada carácter debe determinarse individualmente. En lo que ahora se me ha ocurrido con esto:Manera eficiente de calcular la longitud de bytes de un carácter, según la codificación
char c = getCharSomehow();
String encoding = getEncodingSomehow();
// ...
int length = new String(new char[] { c }).getBytes(encoding).length;
Pero esto es torpe e ineficiente en un bucle desde un new String
necesario crear cada vez. No puedo encontrar otras formas más eficientes en la API de Java. Hay un String#valueOf(char)
, pero según su fuente, básicamente es el mismo que el anterior. Me imagino que esto se puede hacer con operaciones a nivel de bits como desplazamiento de bits, pero eso es mi punto débil y estoy seguro de cómo tomar la codificación en cuenta aquí :)
Si duda de la necesidad de esto, compruebe this topic .
Actualización: la respuesta de @Bkkbrad es técnicamente la más eficiente:
char c = getCharSomehow();
String encoding = getEncodingSomehow();
CharsetEncoder encoder = Charset.forName(encoding).newEncoder();
// ...
int length = encoder.encode(CharBuffer.wrap(new char[] { c })).limit();
Sin embargo, como @Stephen C señalado, hay más problemas con esto. Puede haber, por ejemplo, caracteres combinados/sustitutos que también deben tenerse en cuenta. Pero ese es otro problema que debe resolverse en el paso antes de en este paso.
Utilizando lo anterior tuviste problemas de rendimiento? ¿Siempre quieres usar UTF-8? –
El ejemplo fue de hecho un poco engañoso, pero en realidad la codificación solo se puede determinar durante el tiempo de ejecución. He actualizado la pregunta. Después de todo, esto no parece ser una tarea fácil. – BalusC
esto es completamente incorrecto y también lo es la respuesta de bkkbrad. En realidad, es bastante aterrador ver a tantas personas completamente equivocadas en eso (+1 solo a la respuesta de bkail). Un Java * char * does ** not **, repito ** A JAVA CHAR NO ** representa un personaje más desde Java 1.4/Unicode 3.1. * String.value (char) * y envolviendo "char" * y whatnots son todos métodos de los años noventa. El mundo avanzó y ha pasado mucho tiempo que Unicode tiene más de 65 536 puntos de código. Use "int", saque "char" de su mente porque el carácter de Java está roto sin posibilidad de reparación. \t ♩ \t ♩ \t ♩ \t ♩ – SyntaxT3rr0r