2015-08-27 3 views
0

Я ищу эффективный способ преобразования индексов в строку с одной кодировкой (например, UTF-16) в другую строку с использованием другой кодировки (например, UTF-8). Преобразование строки из одной кодировки в другую тривиально. Вопрос касается только индексов в строках.Как преобразовать индексы строк между различными кодировками?

использования:

У меня есть библиотека бэкенд работает исключительно с UTF-8, который делает некоторый синтаксический анализ, между прочим. Это должно использоваться из библиотеки C#. Я хочу вернуть позиции синтаксической ошибки относительно исходной строки.

+0

Я не думаю, что есть какой-либо прямой путь, помимо прохождения символа по символу и подсчета количества байтов в одной кодировке по сравнению с другой. – deceze

+0

Да, это тоже моя идея, но я надеюсь на какой-то умный способ сделать это. –

ответ

2

Невозможно сделать это без повторения строки и подсчета количества единиц кода, в которые каждый символ будет преобразован.

Однако, если вы собираетесь «вверх» (UTF-8 → UTF-16 → UTF-32), есть несколько ярлыков, которые вы могли бы взять (хотя я не решаюсь утверждать, что они более эффективны без каких-либо эталонные тесты):

  • Если индекс источника UTF-8, вам нужно прочитать только свинцовые байты сказать диапазон точки коды. Например, если вы читаете 0xF0, вы знаете, что кодовая точка будет находиться между U+10000 и U+10FFFF; следовательно, это будет 2 блока UTF-16 (или 1 UTF-32 unit), и вы можете пропустить оставшиеся 3 блока трейла.

  • Если целевым индексом является UTF-32, вы можете просто подсчитать количество ведущих блоков - все станет 1 единиц UTF-32.

Переход 'вниз' (UTF-32 → UTF-16 → UTF-8) не имеет таких ярлыков, хотя.

Смежные вопросы