C # / .NET Основной способ отфильтровать нелатинские символы, но разрешить все акценты и диакритические знаки латинских букв на всех языках, которые их используют - PullRequest
0 голосов
/ 09 мая 2019

Я ищу эффективный способ проверки текстового поля веб-сайта и элементов ввода textarea.Входные данные предназначены только для читаемого человеком текста , такого как имя, адрес, комментарии, вопрос, ответ на опрос и т. Д. Кроме того, действительный ввод должен включать только все символы латинского и латинского алфавита, включая те, которые включены вНаборы символов Latin1, Latin2, Latin3 и Latin4 (см. Википедия ISO-8859 частей ).Это связано с тем, что наш колл-центр может читать только латинские буквы (без китайского, корейского, японского, тайского, русского, арабского, иврита, греческого и т. Д.), Потому что, по крайней мере, когда язык не английский, они могут использовать переводчик Google иликогда для ввода используется текстовый ввод, он все еще может иметь смысл для метки адреса или счета-фактуры.

Поскольку это веб-ввод, символы UTF-8, передаваемые по HTTP, преобразуются системой C # в Unicode (UTF-16) внутренне.Я хочу, чтобы функция возвращала логическое значение, которое может сказать, есть ли в строке нелатинский / латинский символ, но оно не должно быть слишком строгим, чтобы запретить использование необычных римских букв с акцентом, таких как французский Œ, немецкий ẞ, ирландский Ṡ, финский ish, датский Ǿ и т. д. (все они не на латыни1, не говоря уже о ASCII).Конечно, все знаки препинания должны вызывать ложь;это должно решить проблему внедрения HTML / JS / SQL.Второй валидатор (не являющийся частью этого вопроса) отфильтрует допустимые знаки препинания, такие как дефис, точка, апостроф и т. Д.

Я ищу идеи, не обязательно код .У меня такое ощущение, что есть пакет NuGet или уже созданная функция, использующая такие средства .NET, как System.Char.IsLetter и System.Globalization.UnicodeCategory enum .

Значение этого вопроса исходит от других разработчиков, требующих такой же проверки.Частичные ответы приветствуются, и я опубликую окончательное решение по этому вопросу для всех желающих.(Давайте посмотрим, может ли это редактирование вопроса выкупить текущий голос -2 за этот вопрос :-))

РЕДАКТИРОВАТЬ:

Отвечая на отрицательные комментарии ниже, я понимаю, "«Не римлянин» немного расплывчато для компьютерных фанатов, которые любят точность.Но мы находимся в эпоху облаков, когда все люди, говорящие на разных языках, вводят материал на веб-страницу.Я хочу ограничить ввод всеми разновидностями латинских / латинских символов.Под «римским» я подразумеваю все, что происходит от a, b, c, d, e, ... x, y, z.Довольно здравый смысл, тебе не кажется?Поэтому я хочу разрешить использование символов, аналогичных тем, которые используются носителями французского, немецкого, датского, норвежского, болгарского языков и т. Д. НО кроме китайских, корейских, японских, тайских, русских, арабских, иврита, греческих символов.В этом нет ничего плохого, но это просто бизнес-политика, поэтому символы в базе данных, по крайней мере, читабельны и сортируемы.

Так что я не ищу ничего сверхточного здесь, и основное правило заключается в том, что это нужновключить все буквы, определенные в наборах символов Latin1, Latin2, Latin3 и Latin4, но мне требуется фильтр, чтобы определить их как Unicode (так же как и числовое значение символа Unicode, а не набора символов Latin3).Я думаю, что критерии достаточно конкретны.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

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

Ваше регулярное выражение может выглядеть примерно так:

(\s|\p{IsBasicLatin}|\p{IsCombiningDiacriticalMarks})+

Вы могли бы также иметь более широкий диапазон с исключениями. Например:

[\u0000-\u036F-[\p{P}\p{IsIPAExtensions}]]

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

0 голосов
/ 10 мая 2019

Изучив советы от Стена, Скотта Ханнена и Прикс, я решил пойти дальше:

        private static string AllowedCharacterRegexPattern = @"^([a-zA-Z0-9\(\)\+,\-\.'/@_#& ]|[\u00C0-\u024F]|[\u1E00-\u1EFF])+$";
        public static bool AllowedCharacter(string s)
        {
            // Decision:  Characters to include:
            //     Basic Latin: 0x0030-0039, 0x0041-0x005A, 0x0061-0x007A:  0-9, A-Z, a-z  :  (https://unicode.org/charts/PDF/U0000.pdf)
            //     Latin1: 0x00C0 - 0x00FF (https://unicode.org/charts/PDF/U0080.pdf)
            //     Latin Extended A: 0x0100-0x017F (https://unicode.org/charts/PDF/U0100.pdf)
            //     Latin Extended-B: 0x0180-0x24F (https://unicode.org/charts/PDF/U0180.pdf)
            //     Latin Extended Additional: 0x1E00-0x1EFF (https://unicode.org/charts/PDF/U1E00.pdf)
            //     Some punctuation: ( ) + , - . ' / @ _ # &
            return Regex.IsMatch(s, AllowedCharacterRegexPattern);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...