GODiDS
@GODiDS

Как правильно определить наличие символов юникода в тексте через RegularExpressions (или иначе) под .Net?

Собственно код пока получился такой:
IsMatch ("[" & ChrW(128) & "-" & ChrW(65535) & "]", System.Text.RegularExpressions.RegexOptions.IgnoreCase)

ChrW - функция vb, возвращающая символ в текущей кодировке (utf-8) по его номеру (значения типа \xFFFF vb.net почему-то отказался обрабатывать правильно)
Код работает отлично, кроме одного случая - он ругается на символы i (символ 105) и I (символ 73). Такое поведение мне непонятно.
С регулярками раньше дальше * не заходил, может и вообще ересь написал =)
Напомню - сам вопрос в заголовке.
  • Вопрос задан
  • 2356 просмотров
Решения вопроса 1
GODiDS
@GODiDS Автор вопроса
Удалось разобраться:
Достижение 1:
Работает нормально при аналогичном запросе, но с исключением обратного:
"[^" & ChrW(0) & "-" & ChrW(127) & "]"
Так i и I больше не признаёт в приделах 128-65535.
Достижение 2:
Hex код двухбайтового символа задаётся "[\u00FF-\uFFFF]"
Достижение 3:
Зря накопипастил System.Text.RegularExpressions.RegexOptions.IgnoreCase. При отключении этого флага всё работает как надо. Видимо "i" имеет как минимум три представления регистра в utf-8, как минимум одно из которых находится в диапазоне "[\u00FF-\uFFFF]"
(хотя в обратную сторону всё равно не работает, так что вопрос всё ещё не решён полностью)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
lam0x86
@lam0x86
Когда я вижу сообщения с проблемами в обработке символов "i" и "I" при включенном флаге IgnoreCase, сразу возникает подозрение, что сравнение производится с использованием турецкого языка. В нём "i" строчная преобразуется в заглавную "İ", а заглавная "I" (по-русски читается как "ы") преобразуется в строчную "ı" . Честно признаюсь, не копался глубоко в вашей проблеме, но может мой комментарий натолкнёт вас на что-то.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы