Каков наиболее эффективный способ вычисления длины байта символа, учитывающего кодировку символов? Кодирование будет известно только во время выполнения. Например, в 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, с этим возникли проблемы. Могут быть, например, комбинированные/суррогатные символы, которые также необходимо учитывать. Но это еще одна проблема, которая должна быть решена на шаге до этого шага.