Конечно, это возможно. Доказательство:
2 24 = 16,777,216
Таким образом, достаточно места в битах для 1114,112 символов, но чем больше бит-пространства, тем больше битов используется на символ. Весь смысл UTF-8 состоит в том, что он предполагает, что нижние кодовые точки гораздо более вероятны в символьном потоке, поэтому все это будет весьма эффективно, даже если некоторые символы могут использовать 4 байта.
Предположим, что 0-127 остается одним байтом. Это оставляет 8.4M пробелов для 1.1M символов. Затем вы можете решить это уравнение. Выберите схему кодирования, где первый байт определяет, сколько байтов используется. Итак, есть 128 значений. Каждый из них будет представлять собой либо 256 символов (всего 2 байта), либо 65 536 символов (всего 3 байта). Итак:
256x + 65536 (128-x) = 1114112 - 128
Для решения этой проблемы вам необходимо 111 значений первого байта в виде 2-байтовых символов, а оставшихся 17 - 3-байтовых. Для проверки:
128 + 111 * 256 + 17 * 65536 = 1,114,256
Другими словами:
- 128 кодовых точек требуют 1 байт;
- 28 416 кодовых точек требуют 2 байта; и
- 1114,112 кодовых точек требуют 3 байта.
Конечно, это не учитывает неизбежное расширение Unicode, как это делает UTF-8. Вы можете настроить это значение первого байта:
- 0-127 (128) = 1 байт;
- 128-191 (64) = 2 байта;
- 192-255 (64) = 3 байта.
Это было бы лучше, потому что это простое побитовое И тестирует для определения длины и дает адресное пространство 4210816 кодовых точек.