LINUX.ORG.RU

Конвертация «неправильной» строки

 , , ,


0

1

Доброго времени суток,
хочу уметь преобразовывать некорректную utf-8 строку в (тоже, возможно, некорректную) строку utf-16, да так, чтобы при обратном преобразовании «некорретность» сохранилась, то бишь я не потерял никакой информации. Вот, что смог найти по этому поводу (увы, только википедия):

These replacement algorithms are «lossy», as more than one sequence is translated to the same code point. This means that it would not be possible to reliably convert back to the original encoding, therefore losing information. Reserving 128 code points (such as U+DC80–U+DCFF) to indicate errors, and defining the UTF-8 encoding of these points as invalid so they convert to 3 errors, would seem to make conversion lossless. But this runs into practical difficulties: the converted text cannot be modified such that errors are arranged so they convert back into valid UTF-8, which means if the conversion is UTF-16, it cannot also be used to store arbitrary invalid UTF-16, which is usually needed on the same systems that need invalid UTF-8. U+DC80–U+DCFF are reserved for UTF-16 surrogates, so that when they are used for UTF-8 in this way, and the string is converted to UTF-16 this can lead to bugs or the string being rejected.

Что-то не могу распарсить: о каких трех ошибках идет речь вот тут

...so they convert to 3 errors

и почему это поможет мне конвертировать без потерь?
Или, может быть, у кого-то есть уже похожий опыт?


Сначала расскажи, с примерами, что ты на самом деле хочешь сделать.

uuwaan ★★
()

В UTF-8 неправильность появляется, например, по той причине, что часть битов там являются служебными - определяют сколько байт в символе. Эти биты определяют целые структуры, которым должны соответствовать биты в последующих байтах. А они могут, внезапно, и не соответствовать. Тогда это несоответствие можно просто проигнорировать вырезав по маске биты с данными.

А вот в UTF-16 и UTF-32 все символы занимают одинаковое кол-во байт, и, соответственно, такой служебной информации там нет. А потому преобразование без потерь просто невозможно.

saahriktu ★★★★★
()

В UTF-16 некорректный последовательности это только суррогаты, не образующие пару. В UTF-8 некорректных последовательностей намного больше. Любую некорректную последовательность UTF-16 можно закодировать корректными последовательностями UTF-8. Некорректные последовательности UTF-8 закодировать в UTF-16 вообще нельзя.

iliyap ★★★★★
()
Ответ на: комментарий от iliyap

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

UTF-8 использует юниты октеты. Октеты 128-255 не могут быть закодированы валидным юникодным кодпоинтом.

iliyap ★★★★★
()
Ответ на: комментарий от iliyap

Еще есть необратноэквивалентное преобразование. Две 3-байтовые UTF-8 последовательности могут при перекодировании в UTF-16 превращаться в корректную суррогатную пару, которая при перекодировании обратно в UTF-8 превращается в одну 4-байтовую последовательность.

iliyap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.