Встал вопрос как написать стандартное правило 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>>
Здравствуйте, 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.
Здравствуйте, VladD2, Вы писали:
VD>Это вообще не верный код. Он автомат на первом символе всегда сожрет один любой.
Жрать битый юникод неверно само по себе. Так что какое из неверных поведений более неверно вопрос весьма философский.
В твоём случае после HighSurrogates всегда будет съеден один char. Даже если там не суррогатный символ.
В моём случае после HighSurrogates будет съеден только LowSurrogates.
В любом случае я считаю, что если человек засунул в парсер строку которая не является корректной UTF-16 строкой, то он сам себе злобный Буратино.
И если ему уж очень хочется использовать неправильные строки пусть пишет свой Any. Мы в любом случае не угадаем какой Any в его случае правильный.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Здравствуйте, 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>>