Какова формула для определения максимального количества байтов UTF-8, необходимого для кодирования заданного количества кодовых единиц UTF-16 (т. Е. Значения String.Length
в C # / .NET)?
Я вижу 3 варианта:
1) # of UTF-16 code units x 2
2) # of UTF-16 code units x 3
3) # of UTF-16 code units x 4
Кодовая точка UTF-16 представлена 1 или 2 единицами кода, поэтому нам просто нужно рассмотреть сценарий наихудшего случая для строки, заполненной одной или другой. Если строка UTF-16 полностью состоит из 2 кодовых точек кодовой единицы, то мы знаем, что представление UTF-8 будет максимально одного размера, поскольку кодовые точки занимают максимум 4 байта в обоих представлениях, таким образом, наихудший случай вариант (1) выше.
Таким образом, интересный случай, на который я не знаю ответа, - это максимальное количество байтов, которое может потребоваться для одной кодовой единицы UTF-16 в представлении UTF-8.
Если все кодовые точки UTF-16 с одной кодовой единицей могут быть представлены 3 байтами UTF-8, что, как мне подсказывает моя интуиция, наиболее целесообразно, тогда вариант (2) будет сценарием наихудшего случая. Если есть такие, которые требуют 4 байта, то вариант (3) будет ответом.
У кого-нибудь есть понимание, что является правильным? Я действительно надеюсь на (1) или (2), так как (3) все усложнит: /
UPDATE
Я далеко не эксперт по UTF, но из того, что я могу собрать, UTF-16 кодирует все символы в BMP в одной кодовой единице, а все остальные плоскости кодируются в 2 кодовых единицах.
Кажется, что UTF-8 может кодировать весь BMP в пределах 3 байтов и использует 4 байта для кодирования других плоскостей.
Таким образом, мне кажется, что вариант (2) выше является правильным ответом, и это должно сработать:
string str = "Some string";
int maxUtf8EncodedSize = str.Length * 3;
Похоже, это подтвердилось?