что значит setlocale в c
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode
Как включить русский язык в Си
На начальных этапах программирования многие новички сталкиваются с такой проблемой: они в коде пишут какое-либо сообщение на русском языке для консоли (например, используя printf), но при запуске программы вместо русских слов появляются какие-то непонятные знаки. Покажем, как избавиться от этой проблемы.
Например, при запуске вот этой программы:
В консоли будет отображено следующее:
Всё дело в том, что мы не подключили русскую локализацию.
Исправить эту ошибку очень легко!
Для начала надо добавить следующую библиотеку:
Она отвечает за локализацию.
А затем нам надо просто написать в начале тела кода вот эту строку:
Функция setlocale задаёт локализацию программы. По умолчанию это только английский язык.
LC_ALL указывает программе, что локализированы будут все функции.
“Rus”, как легко догадаться говорит о том, что локализация произойдёт на русский язык.
Вот и всё! Мы включили русский язык в Си. Наша программа модернизирована и обогащена на две строки. Теперь она будет выглядеть вот так:
Поделиться в соц. сетях:
15 комментария(ев) к статье “ Как включить русский язык в Си ”
Что именно? Какая ошибка?
Можете попробовать такой код:
#include
#include
#include
int main()
<
setlocale(LC_ALL, “Rus”);
printf(“Всем привет! Как дела?”);
getch(); //В Visual Studio _getch();
return 0;
>
Этот вариант работает, но он не включает русский язык в стандартном потоке ошибок.
Вместо одних каракулей появились другие. Но никаких ошибок не выдает.
Здравствуйте, Евгений. Существует ещё один способ включения русского языка в Си. Попробуйте использовать следующий код:
#include
#include
#include
int main()
<
SetConsoleCP(1251); //установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); //установка кодовой страницы win-cp 1251 в поток вывода
printf(“Всем привет! Как дела?”);
_getch();
return 0;
>
Здравствуйте, использовала такой метод как в статье.
Все работает при выводе текста функцией printf.
Но, когда я считываю слово функцией scanf, а потом вывожу его функцией printf появляются снова непонятные символы.
Подскажите пожалуйста как это можно исправить.
Здравствуйте! Чуть выше в комментариях приводятся ещё два способа, как включить русский язык в Си. Попробуйте их, должно сработать.
У меня та же проблема, с printf всё работает, но вот если ввести при scanf, то в выводе printf будут кракозябры
Попробуйте способы, указанные в комментариях выше. Один из них точно сработает.
Спасибо за инфу! Все работает.
Всё работает! Спасибо большое!
Правильно “Ru”, а не “Rus”.
setlocale(LC_ALL, “Ru”);
у меня получилось так:
#include
#include
#include
void main()
<
setlocale(LC_ALL, “Rus”);
wprintf(L”Спасибо”);
>
Если кто-то пишет в NotePad++ или чём-то подобном, не забудьте поменять кодировку самого файла с UTF-8 на, например, Windows-1251.
Спасибо за статью.
Устанавливает или извлекает языковой стандарт времени выполнения.
Синтаксис
Параметры
category
Категория, на которую влияет языковой стандарт.
locale
Указатель языкового стандарта.
Возвращаемое значение
задает все категории, возвращая только строку
Remarks
_wsetlocale — Это версия с расширенными символами setlocale ; locale аргумент и возвращаемое значение _wsetlocale являются строками расширенных символов. Поведение _wsetlocale и setlocale идентично в противном случае.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это, см. раздел глобальное состояние в CRT.
Универсальное текстовое сопоставление функций
TCHAR.H ассемблер | _UNICODE & _MBCS не определено | _MBCS определяется | _UNICODE определяется |
---|---|---|---|
_tsetlocale | setlocale | setlocale | _wsetlocale |
locale Аргумент — это указатель на строку, указывающую языковой стандарт. Дополнительные сведения о формате locale аргумента см. в разделе языковые имена, языки и строки страны или региона. Если locale указывает на пустую строку, языковой стандарт является собственной средой, определяемой реализацией. Значение C задает минимальную подходящую ANSI среду для переноса C. Языковой стандарт C предполагает, что все типы данных char соответствуют 1 байту, а их значение всегда меньше 256.
При запуске программы выполняется эквивалент следующего оператора:
setlocale( LC_ALL, «C» );
setlocale( LC_ALL, «.OCP» );
setlocale( LC_ALL, «.ACP» );
setlocale( LC_ALL, » _ » );
Задает языковой стандарт для языка, страны или региона, а также кодовую страницу, определяемую строками, и. Можно использовать различные сочетания языка, страны или региона и кодовой страницы. Например, этот вызов устанавливает языковой стандарт «французский (Канада)» с кодовой страницей 1252.
setlocale( LC_ALL, «French_Canada.1252» );
Этот вызов устанавливает языковой стандарт «французский (Канада)» с кодовой страницей по умолчанию ANSI.
setlocale( LC_ALL, «French_Canada.ACP» );
Этот вызов устанавливает языковой стандарт «французский (Канада)» с кодовой страницей по умолчанию OEM.
setlocale( LC_ALL, «French_Canada.OCP» );
setlocale( LC_ALL, «en-US» );
setlocale( LC_ALL, «English» );
setlocale( LC_ALL, «English_United States.1252» );
Рекомендуется использовать первую форму для обеспечения производительности и простоты обслуживания.
Эта категория должна быть LC_ALL или LC_CTYPE для реализации изменения кодовой страницы. Например, если страна или регион по умолчанию и язык операционной системы узла являются » United States » и » English «, следующие два вызова setlocale функционально эквивалентны:
setlocale( LC_ALL, «.1252» );
setlocale( LC_ALL, «English_United States.1252»);
Дополнительные сведения см. в описании setlocale директивы pragma в справочнике по препроцессору C/C++.
Функция _configthreadlocale используется для управления setlocale тем, влияет ли на языковой стандарт для всех потоков в программе или только на языковой стандарт вызывающего потока.
Поддержка UTF-8
Строка для указания режима UTF-8:
В следующих примерах показано, как указать строку UTF-8:
После вызова setlocale(LC_ALL, «.UTF8″) можно передать » 😊 » в, mbtowcs и он будет правильно преобразован в wchar_t строку, в то время как ранее для этого не был доступен параметр языкового стандарта.
режим UTF-8 также включается для функций с историческим переводом char строк с помощью Windows кодовой страницы ANSI по умолчанию (ACP). Например, вызов _mkdir(«😊») при использовании кодовой страницы UTF-8 правильно создаст каталог с этим символом эмодзи в качестве имени папки, а не требует, чтобы ACP был изменен на UTF-8 перед запуском программы. Аналогичным образом, вызов _getcwd() в этой папке вернет строку в кодировке UTF-8. Для обеспечения совместимости ACP по-прежнему используется, если кодовая страница языка C не имеет значение UTF-8.
чтобы использовать эту функцию в ос до Windows 10, например Windows 7, необходимо использовать локальное развертывание приложения или статическую связь с помощью Windows SDK или более поздней 17134 версии. для Windows 10 операционных систем, предшествовавших 17134, поддерживается только статическая компоновка.
Требования
Дополнительные сведения о совместимости см. в разделе Compatibility.
Sets or retrieves the run-time locale.
Syntax
Parameters
category
Category affected by locale.
locale
Locale specifier.
Return value
For example, the call
sets all categories, returning only the string
Remarks
_wsetlocale is a wide-character version of setlocale ; the locale argument and return value of _wsetlocale are wide-character strings. _wsetlocale and setlocale behave identically otherwise.
By default, this function’s global state is scoped to the application. To change this, see Global state in the CRT.
Generic-Text Routine Mappings
TCHAR.H routine | _UNICODE & _MBCS not defined | _MBCS defined | _UNICODE defined |
---|---|---|---|
_tsetlocale | setlocale | setlocale | _wsetlocale |
The category argument specifies the parts of a program’s locale information that are affected. The macros used for category and the parts of the program they affect are as follows:
The locale argument is a pointer to a string that specifies the locale. For information about the format of the locale argument, see Locale Names, Languages, and Country/Region Strings. If locale points to an empty string, the locale is the implementation-defined native environment. A value of C specifies the minimal ANSI conforming environment for C translation. The C locale assumes that all char data types are 1 byte and that their value is always less than 256.
At program startup, the equivalent of the following statement is executed:
setlocale( LC_ALL, «C» );
The locale argument can take a locale name, a language string, a language string and country/region code, a code page, or a language string, country/region code, and code page. The set of available locale names, languages, country/region codes, and code pages includes all those supported by the Windows NLS API. The set of locale names supported by setlocale are described in Locale Names, Languages, and Country/Region Strings. The set of language and country/region strings supported by setlocale are listed in Language Strings and Country/Region Strings. We recommend the locale name form for performance and for maintainability of locale strings embedded in code or serialized to storage. The locale name strings are less likely to be changed by an operating system update than the language and country/region name form.
which is the string that’s associated with the LC_ALL category.
The following examples pertain to the LC_ALL category. Either of the strings «.OCP» and «.ACP» can be used instead of a code page number to specify use of the user-default OEM code page and user-default ANSI code page for that locale name, respectively.
setlocale( LC_ALL, «.OCP» );
setlocale( LC_ALL, «.ACP» );
setlocale( LC_ALL, » _ » );
setlocale( LC_ALL, «French_Canada.1252» );
This call sets the locale to French Canada with the default ANSI code page:
setlocale( LC_ALL, «French_Canada.ACP» );
This call sets the locale to French Canada with the default OEM code page:
setlocale( LC_ALL, «French_Canada.OCP» );
setlocale( LC_ALL, «en-US» );
setlocale( LC_ALL, «English» );
setlocale( LC_ALL, «English_United States.1252» );
We recommend the first form for performance and maintainability.
The category must be either LC_ALL or LC_CTYPE to effect a change of code page. For example, if the default country/region and language of the host operating system are » United States » and » English «, the following two calls to setlocale are functionally equivalent:
setlocale( LC_ALL, «.1252» );
setlocale( LC_ALL, «English_United States.1252»);
For more information, see the setlocale pragma directive in the C/C++ Preprocessor Reference.
The function _configthreadlocale is used to control whether setlocale affects the locale of all threads in a program or only the locale of the calling thread.
UTF-8 Support
The string to specify UTF-8 mode is:
The following examples show how to specify the UTF-8 string:
UTF-8 mode is also enabled for functions that have historically translated char strings using the default Windows ANSI code page (ACP). For example, calling _mkdir(«рџЉ») while using a UTF-8 code page will correctly produce a directory with that emoji as the folder name, instead of requiring the ACP to be changed to UTF-8 before running your program. Likewise, calling _getcwd() in that folder will return a UTF-8 encoded string. For compatibility, the ACP is still used if the C locale code page is not set to UTF-8.
To use this feature on an OS prior to Windows 10, you must use app-local deployment or link statically using version 1803 (10.0.17134.0) of the Windows SDK or later. For Windows 10 operating systems prior to 1803 (10.0.17134.0), only static linking is supported.
Requirements
For more compatibility information, see Compatibility.
Что значит setlocale в c
char *setlocale(int category, const char *locale);
ОПИСАНИЕ
Если locale не равно NULL, то текущая локаль программы изменяется согласно переданным аргументам. Аргументом category определяется какую часть текущей локали программы нужно изменить.
Категория | Определяет |
LC_ALL | Локаль целиком |
LC_ADDRESS | Форматирование адресов и элементов, относящихся к географии (*) |
LC_COLLATE | Сортировка строк |
LC_CTYPE | Классы символов |
LC_IDENTIFICATION | Метаданные, описывающие локаль (*) |
LC_MEASUREMENT | Настройки, относящиеся к единицам измерения (метрические или системы мер США) (*) |
LC_MESSAGES | Локализированные сообщения на родном языке |
LC_MONETARY | Форматирование значений денежных единиц |
LC_NAME | Форматирование приветствий людей (*) |
LC_NUMERIC | Форматирование неденежных числовых значений |
LC_PAPER | Настройки стандартных размеров бумаги (*) |
LC_TELEPHONE | Форматы, используемые в телефонных службах (*) |
LC_TIME | Форматирование значений дат и времени |
Категории, помеченные в таблице звёздочкой, являются расширениями GNU. Дополнительную информацию об этих категориях локали смотрите в locale(7).
Аргумент locale — это указатель на строку символов, содержащую требуемую настройку category. Эта строка может быть понятной константой «C» или «da_DK» (смотрите ниже), или неясной строкой, которую вернул другой вызов setlocale().
Если locale — пустая строка, «», то любая часть локали, которую требуется изменить, будет задана исходя из переменных окружения. Как это происходит — зависит от реализации. В glibc, во-первых (независимо от category), просматривается переменная окружения LC_ALL, затем переменная окружения с именем как у категории (смотрите таблицу выше), и в конце учитывается переменная окружения LANG. Используется первая найденная переменная окружения. Если её значение некорректно определяет локаль, то локаль не изменяется и setlocale() возвращает NULL.
Локали «C» или «POSIX» являются переносимыми локалями; они существуют во всех соответствующих системах.
Если locale равно NULL, то только возвращается текущая локаль и ничего не меняется.
При запуске основной программы по умолчанию выбирается переносимая локаль «C». Программу можно сделать переносимой для всех локалей вызвав
после инициализации программы, используя информацию об установках локали, полученную из вызова localeconv(3), используя многобайтные или широкосимвольные функции при обработке текста, если MB_CUR_MAX > 1 и используя strcoll(3), wcscoll(3) или strxfrm(3), wcsxfrm(3) для сравнения строк.
Класс locale
Класс, описывающий объект языкового стандарта, инкапсулирующий данные по соответствующей культуре в качестве набора аспектов, которые собирательно определяют ту или иную локализованную среду.
Синтаксис
Remarks
Аспект — это указатель на объект класса, выведенного производным от класса facet, который обладает общим объектом в формате:
Можно задать открытый набор данных аспектов. Можно также создать объект языкового стандарта, назначающий произвольное количество аспектов.
Категория collate (LC_COLLATE) включает аспекты:
Категория ctype (LC_CTYPE) включает аспекты:
Категория monetary (LC_MONETARY) включает аспекты:
Категория numeric (LC_NUMERIC) включает аспекты:
Категория time (LC_TIME) включает аспекты:
Категория messages (LC_MESSAGES) включает аспекты:
(Последняя категория необходима для POSIX, но не для стандарта C.)
Некоторые из этих предопределенных аспектов используются iostream классами для управления преобразованием числовых значений в текстовые последовательности и из них.
В данном случае можно также вызвать статическую функцию-член:
создать объект языкового стандарта без аспектов. Это также прозрачный языковой стандарт. Если функции шаблона has_facet и use_facet не могут найти требуемый аспект в прозрачном языковом стандарте, они обращаются к первому глобальному языковому стандарту, а затем, если они прозрачны, классический языковой стандарт. Можно написать:
Последующие операции вставки cout исправляются текущим состоянием глобального языкового стандарта. Можно даже написать:
Числовые правила форматирования для последующих вставок в cout остаются такими же, как в языковом стандарте C, даже если глобальный языковой стандарт предоставляет другие правила вставки дат и денежных сумм.
Конструкторы
Конструктор | Описание |
---|---|
locale | Создает языковой стандарт, копию языкового стандарта или копию языкового стандарта, в которой аспект или категория заменены аспектом или категорией из другого языкового стандарта. |
Определения типов
Имя типа | Описание |
---|---|
category | Целочисленный тип, который содержит значения битовой маски для обозначения стандартных семейств аспектов. |
Функции элементов
Функция-член | Описание |
---|---|
состоят | Вставляет аспект из определенного языкового стандарта в целевой языковой стандарт. |
name | Возвращает имя сохраненного языкового стандарта. |
Статические функции
Имя | Описание |
---|---|
классическая | Данная статическая функция-член возвращает объект языкового стандарта, представляющий классический языковой стандарт C. |
global | Сброс языкового стандарта программы по умолчанию. |
Операторы
Классы
Класс | Описание |
---|---|
устанавливают | Класс, используемый как базовый класс для всех аспектов языкового стандарта. |
id | Класс члена содержит уникальный идентификатор аспекта, применяемый в качестве индекса для поиска аспектов в языковом стандарте. |
Требования
Заголовок:
Пространство имен: std
языковой стандарт:: Category
Целочисленный тип, который содержит значения битовой маски для обозначения стандартных семейств аспектов.
Remarks
Тип является синонимом для int типа, который может представлять группу различных элементов типа битовой маски Local для класса locale или может использоваться для представления любой из соответствующих категорий языкового стандарта C. Элементы:
Два более полезных значения:
locale:: классический
Данная статическая функция-член возвращает объект языкового стандарта, представляющий классический языковой стандарт C.
Возвращаемое значение
Ссылка на языковой стандарт C.
Remarks
Классический язык C — это языковой стандарт ASCII американского английского языка в стандартной библиотеке C. Это языковой стандарт, который неявно используется в программах, которые не являются международными.
Пример
языковой стандарт:: Combine
Вставляет аспект из определенного языкового стандарта в целевой языковой стандарт.
Параметры
source_locale
Языковой стандарт, содержащий аспект для вставки в целевой языковой стандарт.
Возвращаемое значение
Функция-член возвращает объект языкового стандарта, который заменяет или добавляет к * этому аспекту, Facet указанному в source_locale.
Пример
Класс аспекта
Класс, используемый как базовый класс для всех аспектов языкового стандарта.
Remarks
locale:: Global
Сброс языкового стандарта по умолчанию для программы. Этот вызов влияет на глобальный языковой стандарт для C и C++.
Параметры
new_default_locale
Языковой стандарт, который будет использоваться программой по умолчанию.
Возвращаемое значение
Языковой стандарт до сброса языкового стандарта по умолчанию.
Remarks
При запуске программы глобальный языковой стандарт совпадает в классическим языковым стандартом. Функция global() вызывает setlocale( LC_ALL, loc.name. c_str()) для установки соответствующего языкового стандарта в стандартной библиотеке C.
Пример
Класс ID
Класс члена содержит уникальный идентификатор аспекта, применяемый в качестве индекса для поиска аспектов в языковом стандарте.
Remarks
языковой стандарт:: locale
Создает языковой стандарт, копию языкового стандарта или копию языкового стандарта, в которой аспект или категория заменены аспектом или категорией из другого языкового стандарта. Также включает деструктор.
Параметры
locale_name
Имя языкового стандарта.
from_locale
Языковой стандарт, который будет копироваться при создании нового языкового стандарта.
Иной
Языковой стандарт, из которого будет выбираться категория.
new_category
Категория для замены в созданном языковом стандарте.
new_facet
Аспект для замены в созданном языковом стандарте.
Remarks
Первый конструктор инициализирует объект для соответствия глобальному языковому стандарту. Второй и третий конструкторы инициализируют все категории языкового стандарта, чтобы их поведение соответствовало имени локали locale_name. Остальные конструкторы копируют from_locale, за исключением указанных ниже.
заменяет другие аспекты, соответствующие категории c, для которой c & new_category не равно нулю.
заменяет в (или добавляет к) from_locale аспект new_facet, если new_facet не является пустым указателем.
Если имя локали locale_name является пустым указателем или недопустимым, функция создает исключение runtime_error.
Пример
locale:: Name
Возвращает имя сохраненного языкового стандарта.
Возвращаемое значение
Строка, задающая имя языкового стандарта.
Пример
языковой стандарт:: operator =
Назначает языковой стандарт.
языковой стандарт:: operator! =
Проверка двух языковых стандартов на неравенство.
Параметры
Правильно
Один из языковых стандартов для проверки на неравенство.
Возвращаемое значение
Логическое значение, равное, true Если языковые стандарты не являются копиями одного и того же языкового стандарта. false Если языковые стандарты являются копиями одного и того же языкового стандарта.
Remarks
Два языковых стандарта равны, если они совпадают, если одна из них является копией другого или если они имеют одинаковые имена.
Пример
языковой стандарт:: operator ()
Сравнивает два basic_string объекта в соответствии с правилами сравнения лексикографическим порядком, определенными std::collate аспектом локали.
Параметры
слева
Первая сравниваемая строка.
Правильно
Вторая сравниваемая строка.
Возвращаемое значение
Remarks
Функция-член фактически выполняет:
Это означает, что объект языкового стандарта можно использовать в качестве объекта функции.
Пример
языковой стандарт:: operator = =
Проверка двух языковых стандартов на равенство.
Параметры
Правильно
Один из языковых стандартов для проверки на равенство.
Возвращаемое значение
Логическое значение, равное, true Если языковые стандарты являются копиями одного и того же языкового стандарта. false Если языковые стандарты не являются копиями одного и того же языкового стандарта.
Remarks
Два языковых стандарта равны, если они совпадают, если одна из них является копией другого или если они имеют одинаковые имена.