Эффективность - это всегда соотношение скорости и размера. Если скорость предпочтительнее размера, то самый эффективный способ - просто угадать, исходя из длины строки источника.
Есть 4 случая, которые необходимо рассмотреть, просто выберите худший случай в качестве конечного размера буфера:
- U + 0000-U + 007F - будет кодировать до 1 байта в utf8 и 2 байта на символ в utf16. (1: 2 = x2)
- U + 0080-U + 07FF - кодируется в 2-байтовые последовательности utf8 или 2 байта на символ utf16 символов. (2: 2 = x1)
- U + 0800-U + FFFF - сохраняются в виде 3-байтовых последовательностей utf8, но по-прежнему умещаются в один символ utf16. (3: 2 = х.67)
- U + 10000-U + 10FFFF - сохраняются как 4-байтовые последовательности utf8 или суррогатные пары в utf16. (4: 4 = x1)
Коэффициент расширения в худшем случае - при переводе U + 0000-U + 007f из utf8 в utf16: буфер, в свою очередь, просто должен быть в два раза больше исходной строки. Любая другая кодовая точка Unicode приводит к одинаковому размеру или меньшему байтовому распределению, когда кодируется как utf16 как utf8.