Как включить русский язык в Си — Программирование на C, C# и Java

[edit]example

Run this code

Possible output:

[edit]references

  • C17 standard (ISO/IEC 9899:2022):
  • 7.11.1.1 The setlocale function (p: 163-164)
  • C11 standard (ISO/IEC 9899:2022):
  • 7.11.1.1 The setlocale function (p: 224-225)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.11.1.1 The setlocale function (p: 205-206)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.4.1.1 The setlocale function

[edit]return value

pointer to a narrow null-terminated string identifying the C locale after applying the changes, if any, or null pointer on failure.

A copy of the returned string along with the category used in this call to setlocale may be used later in the program to restore the locale back to the state at the end of this call.

Setlocale – c reference

Sets locale information to be used by the current program, either changing the entire locale or portions of it. The function can also be used to retrieve the current locale’s name by passing NULL as the value for argument locale.

Locales contain information on how to interpret and perform certain input/output and transformation operations taking into consideration location and language specific settings.

Most running environments have certain locale information set according to the user preferences or localization. But, independently of this system locale, on start, all C programs have the “C” locale set, which is a rather neutral locale with minimal locale information that allows the result of programs to be predictable. In order to use the default locale set in the environment, this function can be called with "" as argument locale.

On program startup, the locale selected is the "C" locale, which is the same as would be set by calling setlocale(LC_ALL,"C").

The locale settings selected in the environment can be selected by calling setlocale(LC_ALL,"").

The portions of the current locale affected by a call to this function are specified by argument category.

Как включить русский язык в си – программирование на c, c# и java

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

:/>  Force Command для обновления вашей групповой политики

Например, при запуске вот этой программы:

В консоли будет отображено следующее:

Как включить русский язык в Си - vscode.ru

Всё дело в том, что мы не подключили русскую локализацию.

Исправить эту ошибку  очень легко!

Для начала надо добавить следующую библиотеку:

Она отвечает за локализацию.

А затем нам надо просто написать в начале тела кода вот эту строку:

Функция setlocale задаёт локализацию программы. По умолчанию это только английский язык.
LC_ALL указывает программе, что локализированы будут все функции.

«Rus», как легко догадаться говорит о том, что локализация произойдёт на русский язык.

Вот и всё! Мы включили русский язык в Си. Наша программа модернизирована и обогащена на две строки. Теперь она будет выглядеть вот так:

А консоль вот так:

Как включить русский язык в Си - vscode.ru

Менее правильные, но пригодные решения

В любом случае, поставьте юникодный шрифт в консоли. (Это первый абзац «сложного» решения.)

Убедитесь, что ваши исходники в кодировке CP 1251 (это не само собой разумеется, особенно если у вас не русская локаль Windows). Если при добавлении русских букв и сохранении Visual Studio ругается на то, что не может сохранить символы в нужной кодировке, выбирайте CP 1251.

(1) Если компьютер ваш, вы можете поменять кодовую страницу консольных программ на вашей системе. Для этого сделайте вот что:

Методы, которые работают плохо (но могут помочь вам)

Метод, который часто рекомендуют — использование конструкции setlocale(LC_ALL, “Russian”); У этого варианта (по крайней мере в Visual Studio 2022) гора проблем. Во-первых, проблема с вводом русского текста: введённый текст передаётся в программу неправильно!

Ещё один метод, не использующий Unicode — использование функций CharToOem и OemToChar. Этот метод требует перекодировки каждой из строк при выводе, и (кажется) слабо поддаётся автоматизации. Он также страдает от общих для неюникодных решений недостатков.

Кроме того, этот метод не будет работать (не только с константами, но и с runtime-строками!) на нерусской Windows, т. к. там OEM-кодировка не будет совпадать с CP866. В дополнение можно так же сказать что эти функции поставляются не со всеми версиями Visual Studio — например в некоторых версиях VS Express их просто нет.

:/>  Как командой закрыть программу

Правильное, но сложное решение

Для начала, проблема у консоли Windows состоит в том, что её шрифты, которые стоят «по умолчанию», показывают не все символы. Вам следует сменить шрифт консоли на юникодный, это позволит работать даже на английской Windows. Если вы хотите поменять шрифт только для вашей программы, в её консоли нажмите на иконку в левом верхнем углу → Свойства → Шрифт. Если хотите поменять для всех будущих программ, то же самое, только заходите в Умолчания, а не Свойства.

Lucida Console и Consolas справляются со всем, кроме иероглифов. Если ваши консольные шрифты позволят, вы сможете вывести и 猫, если нет, то лишь те символы, которые поддерживаются.

Дальнейшее рассмотрение касается лишь Microsoft Visual Studio. Если у вас другой компилятор, пользуйтесь предложенными на свой страх и риск, никакой гарантии нету.

Теперь, кодировка входных файлов компилятора. Компилятор Microsoft Visual Studio (по крайней мере, версии 2022 и 2022) компилирует исходники в однобайтных кодировках так, как будто бы они на самом деле в ANSI-кодировке, то есть для случая русской системы — CP1251.

Это означает, что кодировка исходников в CP866 — неправильна. (Это важно, если вы используете L”…”-строки.) С другой стороны, если вы храните исходники в CP1251, то эти же исходники не будут нормально собираться на нерусской Windows. Поэтому стоит хранить исходники в Unicode (например, UTF-8).

Настроив среду, перейдём к решению собственно задачи.

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

(Ещё одна проблема, которую решает использование широких строк: узкие строки при компиляции кодируются в однобайтную кодировку используя текущую системную кодовую страницу, то есть, ANSI-кодировку. Если вы компилируете вашу программу на английской Windows, это приведёт к очевидным проблемам.)

Вам нужно _setmode(_fileno(…), _O_U16TEXT); для переключения режима консоли:

#include <iostream>
#include <io.h>
#include <fcntl.h>
int wmain(int argc, wchar_t* argv[])
{ _setmode(_fileno(stdout), _O_U16TEXT); _setmode(_fileno(stdin), _O_U16TEXT); _setmode(_fileno(stderr), _O_U16TEXT); std::wcout << L"Unicode -- English -- Русский -- Ελληνικά -- Español." << std::endl; // или wprintf(L"%s", L"Unicode -- English -- Русский -- Ελληνικά -- Español.n"); return 0;
}

Такой способ должен работать правильно с вводом и выводом, с именами файлов и перенаправлением потоков.

:/>  Как узнать и где посмотреть объем памяти видеокарты – 9 вариантов на Windows 10

Важное замечание: потоки ввода-вывода находятся либо в «широком», либо в «узком» состоянии — то есть, в них выводится либо только char*, либо только wchar_t*. После первого вывода переключение не всегда возможно. Поэтому такой код:

cout << 5; // или printf("%d", 5);
wcout << L"привет"; // или wprintf(L"%s", L"привет");

вполне может не сработать. Используйте только wprintf/wcout.

С | локализация и кириллица в консоли

Последнее обновление: 18.05.2022

При использовании кириллических символов мы можем столкнуться с ситуацией, когда вместо кириллических символов отображаются непонятные знаки. Особенно
это актуально для ОС Windows. И в этом случае необходимо явным образом задать текущую локаль (культуру) для вывода символов.
В Си это делается с помощью функции setlocale(), определение которой имеется в заголовочном файле locale.h.

Итак, изменим код, который использовался в прошлых темах следующим образом:

#include <stdio.h>
int main(void)
{	printf("Привет мир! n");	return 0;
}

Компиляция и запуск в ОС Windows может выглядеть следующим образом:

Русский язык в Си в консоли

Вместо русских слов я получаю непонятные символы, и это не то, что ожидалось. Теперь изменим код, применив функцию setlocale:

#include <stdio.h>
#include <locale.h>
int main(void)
{	char *locale = setlocale(LC_ALL, "");	printf("Привет мир! n");	return 0;
}

Поскольку функция setlocale определена в файле locale.h, то он подключается с помощью директивы #include <locale.h>.

Повторно компилируем и запустим приложение:

Кириллица в консоли в Си

Стоит отметить, что в качестве кодировки текстового файла в этом случае должна использоваться кодировка ANSI или Windows-1251, но не UTF-8.

На некоторых платформах, например, Ubuntu 16.04, мы можем не столкнуться с подобной проблемой. И в этом случае вызов функции setlocale просто не окажет никакого влияния.

НазадСодержаниеВперед