Информация об изменениях

Сообщение Re: Nitra и UTF-16 от 21.04.2016 18:27

Изменено 21.04.2016 18:29 VladD2

Здравствуйте, 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'];
regex NonSurrogate  = Any16 - HighSurrogate;
regex Any = HighSurrogate Any16 | NonSurrogate;


Вот тогда он сожрет или правильную сурогатную пару, или два отдельных символа, в которых может быть грязь.
Здравствуйте, 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'..'\u DBFF']; // DBFF - это граница корректного HighSurrogate
regex NonSurrogate  = Any16 - HighSurrogate;
regex Any = HighSurrogate Any16 | NonSurrogate;


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

DBFF — это граница корректного HighSurrogate все что между ним и DFFF — это некорректрый сурогат. Это значение должно встречаться в LowSurrogates.