Nitra и UTF-16
От: WolfHound  
Дата: 21.04.16 18:23
Оценка:
Встал вопрос как написать стандартное правило Any

Вариант первый: только корректные UTF-16 последовательности.
regex HighSurrogates = ['\uD800'..'\uDBFF'];
regex LowSurrogates  = ['\uDC00'..'\uDFFF'];
regex NonSurrogates  = ['\u0000'..'\uD7FF', '\uE000'..'\uFFFD'];
regex Any = HighSurrogates LowSurrogates | NonSurrogates;


Вариант второй: корректные UTF-16 суррогаты и все остальные символы. Включая битые суррогаты и прочий мусор.
regex HighSurrogates = ['\uD800'..'\uDBFF'];
regex LowSurrogates  = ['\uDC00'..'\uDFFF'];
regex Any = HighSurrogates LowSurrogates | ['\u0000'..'\uFFFF'];
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Отредактировано 21.04.2016 18:28 VladD2 . Предыдущая версия .
Re: Nitra и UTF-16
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.04.16 18:27
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>
WH>regex HighSurrogates = ['\uD800'..'\uDBFF'];
WH>regex LowSurrogates  = ['\uDC00'..'\uDFFF'];
WH>regex Any = HighSurrogates LowSurrogates | ['\u0000'..'\uFFFF'];
WH>


Это вообще не верный код. Он автомат на первом символе всегда сожрет один любой.
Должно быть что-то вроде:
regex Any16         = ['\u0000'..'\uFFFF'];
regex HighSurrogate = ['\uD800'..'\uDBFF']; // DBFF - это граница корректного HighSurrogate
regex NonSurrogate  = Any16 - HighSurrogate;
regex Any = HighSurrogate Any16 | NonSurrogate;


Вот тогда он сожрет или правильную сурогатную пару, или два отдельных символа, в которых может быть грязь.

DBFF — это граница корректного HighSurrogate все что между ним и DFFF — это некорректрый сурогат. Это значение должно встречаться в LowSurrogates.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 21.04.2016 18:32 VladD2 . Предыдущая версия . Еще …
Отредактировано 21.04.2016 18:31 VladD2 . Предыдущая версия .
Отредактировано 21.04.2016 18:29 VladD2 . Предыдущая версия .
Отредактировано 21.04.2016 18:27 VladD2 . Предыдущая версия .
Re[2]: Nitra и UTF-16
От: WolfHound  
Дата: 21.04.16 21:14
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Это вообще не верный код. Он автомат на первом символе всегда сожрет один любой.

Жрать битый юникод неверно само по себе. Так что какое из неверных поведений более неверно вопрос весьма философский.
В твоём случае после HighSurrogates всегда будет съеден один char. Даже если там не суррогатный символ.
В моём случае после HighSurrogates будет съеден только LowSurrogates.

В любом случае я считаю, что если человек засунул в парсер строку которая не является корректной UTF-16 строкой, то он сам себе злобный Буратино.
И если ему уж очень хочется использовать неправильные строки пусть пишет свой Any. Мы в любом случае не угадаем какой Any в его случае правильный.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Nitra и UTF-16
От: WolfHound  
Дата: 24.04.16 16:54
Оценка: 189 (4)
Здравствуйте, WolfHound, Вы писали:

WH>Вариант первый: только корректные UTF-16 последовательности.

WH>
WH>regex HighSurrogates = ['\uD800'..'\uDBFF'];
WH>regex LowSurrogates  = ['\uDC00'..'\uDFFF'];
WH>regex NonSurrogates  = ['\u0000'..'\uD7FF', '\uE000'..'\uFFFD'];
WH>regex Any = HighSurrogates LowSurrogates | NonSurrogates;
WH>

Сделал этот вариант. Если будут вопросы будем думать.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.