Как сделать русский язык в консоли Windows; изменить каразябли на русские буквы в консоли, сделать русский язык в консоли; почему программа не пишет русскими буквами; изменить локализацию консоли на python; настроить русский в консоли C / C++;

Это пул вопросов, которые обычно задают новички, шагающие по миру создания программ. И так, всем хаюшки 🤟! С Вами Федосов Вовка 😜, и мы поговорим о том, как же всё-таки сделать русский язык в консоли Windows на C++ / C / PHP / Python и так далее, а также разберём, что можно ещё локализовать.

locale — локализация

Нежно называемый в интернете locale как «локаль» переводится в более брутальное русское слово: локализация. Уже понятнее, о чём идёт речь 👀? Однако, мы раскроем этот термин: локализация — это адаптация программного обеспечения к особенностям языка и культуры определённого региона. То есть, перевод слов и текста; изменение особенностей программы к культурным явлением (левописание, правописание); изменение обозначения валют, флагов, времени. Да даже использование делителя дробной части в виде точки или запятой. Все эти вопросы и решает локализация.

Мы не будем лесть в дебри реализации локализации на уровне операционной системы — это для вас. господа, будет очень муторно. Но основную функцию изменения локализации мы здесь рассмотрим, и сделаем, наконец, консоль, которая может в русский язык! 😜

Знакомьтесь setlocale, locale

char * setlocale( int category, const char * locale );

Именно так она первоначально и объявлена — функция установки локализации программы. Изначально она родом как раз из знаменитого языка «Си», и так, либо иначе её функциональность перекатила и в другие языки программирования. В зависимости от реализации, даже между разными компиляторами «Си», отличается, разве что, возвращаемым значением и хранением ключевых параметров.

В языках, как Java, данная функция практически отсутствует, но в место неё реализован класс locale, который, так или иначе, повторяет функциональность вышеуказанной функции. Поэтому изучив её, можно смело интерпретировать знания на другие функции локализации в других языках.

Настоящую функцию можно найти для языка Си:

#include <locale.h>

Для языка С++:

#include <clocale>

Для языка Python

import locale

в PHP она доступна изначально.

Функция в качестве параметра принимает два значения:

category — определяет категорию, для которой будет установлена локализация. Всего их 6 категорий — основных. Но возможны расширения, в зависимости от потребности языка и среды (например, интерпретатора [LC_MESSAGES характерна для PHP, она устанавливает локализацию у системных сообщений]).

КатегорияОписание категории
LC_ALLКатегория, которая устанавливает локализацию на все другие категории однотипную. Это полезно, когда необходимо конкретно переключить локализацию именно на один определённый регион (не язык, а регион. — ниже об этом)
LC_COLLATEКатегория, которая влияет на локализацию функций сравнения строк.
LC_CTYPEКатегория устанавливает локализацию на функции сопоставления строк, включая многобайтовые кодировки, как UTF-8, UTF-16, UTF-32.
LC_MOMENTARYКатегория устанавливает режим определения национальной валюты.
LC_NUMERICКатегория устанавливает правила разделения на десятичные части больших чисел, а также влияет на делитель дробной части (правило точки и запятой)
LC_TIMEКатегория устанавливает правила формирования времени и её локализацию.

В языках Си с С++ данные категории указаны в виде макросов соответствующих файлов заголовков. Подобным же образом реализовано в PHP только в виде глобальных констант. В Python’е же реализовано как список нумерованных констант класса locale, и к нему доступ получаем так:

import locale
locale.setlocale(locale.LC_ALL, 'ru_ru')

locale — это массив строки, передающий в функцию наименование локализации. Тут опять, в зависимости от среды, может необходимо будет указать страну (полное название на английском языке), или же название языка. Иногда нужно указать таблицу или даже кодировку, которой необходимо будет пользоваться. Но самое распространённое, это указание пары: язык — регион.

Редкое, но всё же встречающийся в разных реализациях, определение по названию государства. Чтобы включить в таком случае русский язык в локализации, в этот параметр необходимо будет загнать строчку, содержащую полное название государства:

"Russian Federation"

Иногда будет достаточно указать краткое название страны или название языка:

"Russia" - название страны
"Russian" - название языка

Реже необходимо указать кодировку. Например, для кодировки ANSI русского языка достаточно указать:

"1049"

Но самое распространённое — это пара языка и региона. На примере разберём три пары:

ru_RU
ru_UA
ru_US

Все три пары указывают, что основной язык — это русский (ru), но каждая отдельная пара указывает ещё и регион (заглавными буквами). То есть: ru_RU — это русский язык в регионе Российской Федерации, ru_UA — это русский язык в регионе Украины, а ru_US — это русский язык в регионе США.

Поэтому правильно говорить, что функция setlocale устанавливает регион, что подразумевает и указание языка

Дополнительно пара может снабжаться и кодировкой, для этого её необходимо указать после региона, разделив точкой, например:

ru_RU.utf-8 указывает, что необходима локализация русского языка в регионе Российской Федерации в кодировке UTF-8.

Помимо этого, данный параметр может принимать ещё два вида значения:

«С» — минимальная локализация, при которой работает стандарт языка Си;
«» — (пустая строка) указывает на локализацию, которая установлена в среде (здесь в зависимости от типа, опять таки, сборки и инструмента, в среде самого инструмента или в среде исполнения программы).

А теперь примерчик

ДисклеймеР: ‼️Внимание‼️ В настоящем коде я не слежу за выделением и удалением памяти. Этот код призван продемонстрировать работу функции setlocale. Не забываем, что каждую вновь созданную структуру, объект, выделенную память необходимо освобождать.

Ниже я приведу обыкновенную реализацию тестов функции в Visual Studio. Скопировав нижеуказанный код в файл main консольного проекта — он должен запуститься.

#include <iostream>
#include <ctime>
#include <clocale>

#pragma warning(disable : 4996)

int main()
{
    //получим время
    time_t numb_sec;
    struct tm* timeinfo;
    char buffer[100];

    time(&numb_sec);
    timeinfo = localtime(&numb_sec);

    //для английского языка
    std::cout << "en: locale = " << setlocale(LC_ALL, "en_US") << std::endl;
    strftime(buffer, 100, "%c", timeinfo);
    std::cout << "en: time = " << buffer << std::endl;
    std::cout << "en: money = " << localeconv()->int_curr_symbol << std::endl;

    //установим локализацию времени во французском варианте
    setlocale(LC_TIME, "fr_FR");

    //повторим строки выше
    strftime(buffer, 100, "%c", timeinfo);
    std::cout << "fr: time = " << buffer << std::endl;
    std::cout << "fr: money = " << localeconv()->int_curr_symbol << std::endl;

    //и установим локализацию для русского языка:
    std::cout << "en: locale = " << setlocale(LC_ALL, "ru_RU") << std::endl;
    strftime(buffer, 100, "%c", timeinfo);
    std::cout << "en: time = " << buffer << std::endl;
    std::cout << "en: money = " << localeconv()->int_curr_symbol << std::endl;

    //и установим украинскую локализацию
    std::cout << "en: locale = " << setlocale(LC_ALL, "ru_UA") << std::endl;
    strftime(buffer, 100, "%c", timeinfo);
    std::cout << "en: time = " << buffer << std::endl;
    std::cout << "en: money = " << localeconv()->int_curr_symbol << std::endl;

    return 0;
}

В первых строчках функции main мы объявляем необходимые переменные для определения текущего времени. И после получаем текущее время вызовом функций time, licaltime. Право, последняя функция лишь заполняет структуру timeinfo, разбивая секунды на минуты, часы, дни, месяцы, года.

И после следуют 4 одинаковых теста. Первый тест выводит информацию о локализации, времени и единице валюты для английского языка региона США. На втором тесте мы меняем локализацию только для времени, определив его для французского языка региона Франции.

Третий тест ставит локализацию русского языка для Российской Федерации, а четвёртый тест ставит локализацию русского языка для Украины.

Результат работы будет такой:

Заметочка: с помощью localeconv() можно получить информацию о всех аспектах локализации, куда входит и национальный символ валюты, и делитель, и другая информация.

И всё же! Как сделать консоль на русском языке!?

Ну и главный вопрос, скорее, из-за которого вы читаете мой блог, это как сделать в консоли русский язык. Очень просто, использовать локализацию русского языка для Российской Федерации:

#include <iostream>
#include <clocale>

int main()
{
    setlocale(LC_ALL, "ru_RU");

    std::cout << "Привет, мир!" << std::endl;

    return 0;
}

Результатом работы программы будет:

От Vovka

Похожие записи

Добавить комментарий