Как наиболее эффективно рассчитать длину символа в байтах, учитывая кодировку символов? Кодировка будет известна только во время выполнения. Например, в UTF-8 символы имеют переменную длину байта, поэтому каждый символ должен определяться индивидуально. Как далеко сейчас я придумал это:
char c = getCharSomehow();
String encoding = getEncodingSomehow();
// ...
int length = new String(new char[] { c }).getBytes(encoding).length;
Но это неуклюже и неэффективно в цикле, поскольку new String
нужно создавать каждый раз. Я не могу найти другие и более эффективные способы в Java API. Существует String#valueOf(char)
, но в соответствии с его источником он в основном такой же, как указано выше. Я полагаю, что это можно сделать с помощью побитовых операций, таких как битовое смещение, но это мое слабое место, и я не уверен, как здесь учитывать кодировку:)
Если вы сомневаетесь в необходимости этого, отметьте эту тему .
Обновление: ответ от @ Bkkbrad технически наиболее эффективен:
char c = getCharSomehow();
String encoding = getEncodingSomehow();
CharsetEncoder encoder = Charset.forName(encoding).newEncoder();
// ...
int length = encoder.encode(CharBuffer.wrap(new char[] { c })).limit();
Однако, как указал @ Stephen C , с этим есть и другие проблемы. Например, могут быть комбинированные / суррогатные символы, которые также должны быть приняты во внимание. Но это еще одна проблема, которую необходимо решить на шаге до этого шага.