Возможно ли преобразование между UTF-8 и UTF-16 без первого декодирования в UCS-4, а затем кодирование результирующей кодовой точки без использования большой таблицы сопоставлений?Преобразование между UTF: s без промежуточной кодировки
ответ
Я думаю, что этот вопрос является более интересным, чем комментарии предполагают:
UTF-8 -> UTF-16: Это не возможно, если вы пишете UTF-16 слово в слово (если вы напишете байт по байт, я думаю, это зависит от UTF-16LE против UTF-16BE). UTF-8 кодирует 7 бит с 1 байтом, 11 бит с 2 байтами (5/6 бит), 16 бит с 3 байтами (4/6/6 бит) и 21 бит с 4 байтами (3/6/6/6) , Единственный интересный случай - это то, где вы читаете более 16 бит, преследуя первое слово UTF-16, то есть 21 бит. К сожалению, первые четыре байта UTF-8 содержат только 15 бит (3 + 6 + 6), поэтому вы не можете записать первое слово UTF-16, пока не прочитаете все четыре байта. Поэтому нет никакой разницы в декодировании в UCS-4.
UTF-16 -> UTF-8: После прочтения первого слова вы знаете, находитесь ли вы выше 0xffff, и в этом случае вы получаете 11-й бит и общее количество бит, и вы знаете, что это больше, чем 16. Итак, в этом случае вы можете записать первые два байта UTF-8 (3 + 6 = 9 бит).
Какой язык вы используете? Я думаю, что это возможно одним способом 8 -> 16, но невозможно 16 -> 8 без потери информации. (Вы можете поместить 1 байт в 2 байта, но вы не можете поместить 2 байта в 1 байт) – CrApHeR
@CrApHeR Я прошу алгоритм. Кодированные значения UTF-8 могут также использовать 4 байта ... – user877329
Как правило, вы можете конвертировать любую кодировку в любую кодировку напрямую, если у вас есть необходимые таблицы сопоставления. Поскольку создание отдельной таблицы сопоставления между каждым объединением кодирования является экспоненциальным и в основном бессмысленным, используется один стандартный посредник. Поэтому, чтобы ответить на ваш вопрос: да, это возможно. Кто-то уже сделал необходимую работу, несколько выходит за рамки SO. – deceze