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

Просматривая исходник одной из программ, увидел следующую строку:
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

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

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