• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Как можно быстро получить все буквы русского или английского алфавита?

Просматривая исходник одной из программ, увидел следующую строку:
C#:
List<char> alphabet = new List<char> {"A","B","C","D","E" и т.д.};


Как видно обычный лист, заполненный значениями, в плане синтаксиса ошибок нет, но есть один минус, все значения были введены вручную. С одной стороны значений не много, всего 26, в принципе можно и ввести, но если, к примеру, понадобиться добавить ещё один такой же лист, который будет содержать все буквы русского алфавита или сразу два списка обоих алфавитов в нижнем регистре, как быть тогда, тоже все руками вводить? Конечно, можно найти и скопировать уже готовый список значений и ничего вводить вручную не придется, но есть ещё один способ, о нём я расскажу в этой статье.

Как получить все буквы английского алфавита
Для начала вспоминаем, что есть такая вещь, как Unicode. Юникод — это стандарт кодирования символов, который позволяет представить знаки практически всех письменных языков Википедия. В данный момент в нём зарезервировано 1.112.064 позиций символов, из которых сейчас используется чуть более 100 000. Кодовое пространство Unicode разделено на 17 плоскостей. Нас интересует нулевая (базовая многоязычная) плоскость, имеющая диапазон от U+0000 до U+FFFF. Нулевая плоскость, содержит символы, часто употребительных письменностей и так же разбита на определенные области (диапазоны).

Латиница
Все области нас, конечно же, не интересуют, будем работать лишь с некоторыми диапазонами значений. И так, например, в нашей программе требуется получить все буквы английского алфавита от A до Z. Сразу надо пояснить, что Юникод не содержит буквы английского алфавита, точно так же, как и не содержит буквы немецкого, русского алфавита. А всё потому, что хоть мы и говорим, например буквы английского алфавита, на самом деле все буквы немецкого, итальянского, французского и того же английского языка состоят из 26 букв латинского алфавита. Поэтому нам нужно искать область, выделенную под латиницу.

Основной диапазон, выделенный под латиницу от U+0020 до U+007F (Основная латиница), где U Unicode, а следом идут четыре шестнадцатеричных числа. Вся эта область нам, конечно же, не нужна, потому что кроме букв, в нёй так же содержится ещё много других знаков и чисел, которые нас пока что не интересуют.
C#:
char value = '\u0025'; //знак %
char value2 = '\u0044'; // латинская буква D


Для указания юникод последовательности в языке c# используется управляющая последовательность символов \u.

Юникод запись, например &#8216;\u0025&#8217; можно сократить, если использовать другую управляющую последовательность символов \x
C#:
char value = '\x25'; //знак %
char value2 = '\x44';//D
Результаты те же.

Выделенная область под латиницу занимает диапазон от \u0020 до \u007F (\x20 – \x7F). Этот основной диапазон, который кроме букв, так же содержит числа и символы (%, $, #), нам же нужен отрезок, который содержит только буквы латинского алфавита. Сразу хочу сказать, что буквы представлены, как в верхнем регистре, то есть все буквы от A до Z большие, так и в нижнем регистре, когда все буквы от a до z маленькие.

Область, выделенная под буквы верхнего регистра: от \x41 до \x5А
C#:
char value = '\x41'; //A
char value2 = '\x5А'; //Z
char value2 = '\u005A'; //Z

Шестнадцатеричная система не очень удобна для восприятия, поэтому переведем шестнадцатеричные коды в десятичную систему.

Как перевести число из шестнадцатеричной системы в десятичную
Сначала добавим строку: using System.Globalization;

Затем, берём шестнадцатеричный набор символов \x41, убираем первые два символа (\x) оставляем только 41, после чего используя метод parse, преобразуем строку в число.
C#:
string hex = "41"; //A
int dec = int.Parse(hex, NumberStyles.HexNumber); //65
либо обрезаем первые два символа
C#:
string hex = "\x41"; //A
int.Parse(s.Substring(2), NumberStyles.HexNumber); //тоже самое 65

В результате преобразования получили число 65, если теперь подставить ‘\x5А’ и так же преобразовать строку в число, то получим число 90. Из этого следует, что диапазон от 65-90 &#8212; это и есть наш отрезок, в котором содержаться все латинские буквы в верхнем регистре, как видно ничего сложного.

Как перевести число в шестнадцатиричную систему
Обратный перевод dec в hex.
C#:
int dec = 65;
string hexValue = dec.ToString("X"); //41 ('\x41')
либо в unicode
C#:
string hexValue = dec.ToString("X4"); //0041 ('\u0041')

В результате всех вычислений получаем следующую табличку:
НазваниеСимволыDECHEX
ЛатиницаA..Z65..9041..5A
Латиницаa..z97..12261..7A
Теперь имея на руках данную таблицу, можно легко получить, к примеру, массив всех английских букв от A до Z в верхнем регистре.

C#:
static void Main()
{
List<char> alphabet = new List<char>();
for (int i = 65; i < 91; i++)
{
alphabet.Add((char)i);
}
//Выводим все буквы
for (int i = 0; i < alphabet.Count; i++)
{
Console.WriteLine(i + 1 + " - " + alphabet[i]);
}
Console.ReadLine();
}
А вот так, например можно вывести слово HELLO из полученного массива
C#:
Console.WriteLine(alphabet[7].ToString() + alphabet[4] + alphabet[11] + alphabet[11] + alphabet[14]);


Как получить все буквы русского алфавита
С латиницей, надеюсь всё понятно, теперь рассмотрим, как получить буквы русского алфавита. В отличие от английского алфавита, в русском используется Кириллица (Cyrillic), под которую так же в нулевой плоскости выделен определенный диапазон: U+0400..U+04FF (Unicode 1.1).

НазваниеСимволDECHEXDEC код Ё
КириллицаА…Я1040..10710410..042F1025
Кириллицаа..я1072..11030430..044F1105
Как видно всё то же самое, но есть один нюанс, в диапазон значений не попадает буква Ё, как для нижнего, так и верхнего регистра.

В следующем примере показано, как получить все буквы русского алфавита от А до Я в верхнем регистре.
C#:
List<char> Alphabet = new List<char>();
for (int i = 1040; i < 1072; i++)
{
Alphabet.Add((char)i);
//добавляем Ё
if (i == 1045)
Alphabet.Add((char)1025);
}


И напоследок таблица чисел
НазваниеСимволыDECHEX
Числа0..948..5730..39

Читайте также:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!