Старое приложение веб-формы C# ASP.Net с .Net Framework 4.6.2.
У меня есть валидатор регулярных выражений в пользовательском элементе управления ascx:
<asp:RegularExpressionValidator ID = "REV_RecordId" runat = "server"
ControlToValidate = "uxRecordID"
ValidationGroup = "TheValidationGroup"
Display = "Dynamic"
ForeColor = "Red"
ErrorMessage = "Please enter a valid ID"
SetFocusOnError = "True"
ValidationExpression = "^[-\wÀ-ÿ\'\.\-\&\s]+$" />
но когда этот элемент управления загружен
UserControl ctrl = (UserControl)LoadControl("path to user control");
Я получаю исключение:
Внутреннее исключение 1:
ArgumentException: синтаксический анализ "^[-\wÀ-ÿ'.-&\s]+$" - диапазон [x-y] в обратном порядке.
но любой валидатор регулярных выражений говорит, что «^[-\wÀ-ÿ'.-&\s]+$» является допустимым, компонент более высокого символа, говорящий «соответствует одному символу в диапазоне между À (индекс 192) и ÿ (индекс 255 ) (с учетом регистра)".
Так почему же здесь не удалось показать еще более странные интерпретации персонажей?
Это похоже на проблему с кодировкой символов. Строки в .NET имеют кодировку UTF16 . Кажется, ваше регулярное выражение предполагает кодовую страницу Windows-1252. В сообщении об ошибке À
является результатом того, что (двухбайтовая) кодировка UTF16 À
читается так, как если бы это была Windows-1252 (один символ на байт), и аналогично ÿ
=> ÿ
. Без исследования я не могу сказать вам, как исправить это для вашего случая/среды, но это должно дать вам отправную точку.
существует ли версия À и ÿ в кодировке UTF16?
Это не тот вопрос, который вам следует задавать. Вам следует задать вопрос: «в какой кодировке я сохранил файл, содержащий мой <asp:RegularExpressionValidator>
, и в какой кодировке мне следует его сохранить».
Спасибо! Другие страницы, которые работают, сохраняются как кодовая страница Unicode (UTF-8 с подписью) 65001. Эта страница, которая не работает, — «Западноевропейская (Windows) — кодовая страница 1252». Пожалуйста, добавьте это как ответ.
@GSerg Правильная кодировка файла сама по себе решила эту проблему. Спасибо
Вы можете использовать другое обозначение символов Юникода:
ValidationExpression = "^[\-\w\u00C0-\u00FF'.&\s]+$"
где À
представлено как \u00C0
, а ÿ
как \u00FF
.
Обратите внимание, что ваше исходное регулярное выражение содержит избыточные escape-символы и двойное объявление дефиса (в начале, а затем \-
), я сохранил первый, и давайте оставим его экранированным на тот случай, если вы захотите позже использовать регулярное выражение в атрибуте HTML pattern
.
существует ли версия À и ÿ в кодировке UTF16?
Это не тот вопрос, который вам следует задавать. Вам следует задаться вопросом: «в какой кодировке я сохранил файл, содержащий мой <asp:RegularExpressionValidator>
, и в какой кодировке мне следует его сохранить?»
Ваше регулярное выражение видит выражение, отличное от того, которое вы написали в файле, потому что файл не читается в той же кодировке, в которой вы его сохранили.
"^[-\wÀ-ÿ\'\.\-\&\s]+$" допустимо, но ошибка вызывает другое регулярное выражение и "^[-\wÀ-ÿ'.-&\s]+$" недействителен. Вы уверены, что ваше регулярное выражение не переопределено. Или вы получаете эту ошибку от другого валидатора?