Setlocale lc all windows

Локали и кодировки

Введение

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

Работа с локалями в PHP

Работа с локалями в PHP выглядит одинаково и в UNIX, и в Windows, и в любой другой платформе. Для установки значений локали служит всего одна функция setlocale() . Чтобы выставить локаль, нужно передать функции первым аргументом категорию, на которую эта локаль распространяется, последующими список возможных локалей. Результатом будет название первой подходящей локали, которая и была установлена.

Локали в Windows

Для того, чтобы узнать, какие локали доступны в Windows, нужно зайти в панель управления, «Язык и региональные стандарты».

На вкладке «Дополнительно», в разделе «Кодовые страницы таблиц преобразования» показан список всех возможных локалей для Windows, которые можно использовать в PHP.

Кодовые страницы, которые отмечены в списке, из PHP могут быть использованы по их номеру.

В общем случае, использование выглядит по следующей схеме: Язык_Регион.Номер_кодовой_страницы

Для России это может выглядеть как Russian_Russia.1251 (cp1251) или Russian_Russia.20866 (KOI8-R).

Для Украины — Ukrainian_Ukraine.1251 (cp1251).

Вместо длинных названий можно использовать сокращённые russian , american , ukrainian и так далее. При этом кодовая страница выставится с учётом региональных настроек, для России и Украины — 1251, для Америки — 1252.

Единственная кодировка, с которой у меня возникли проблемы, как ни странно, оказалась UTF-8. При попытке выставить эту кодировку, выставляются все категории локалей, кроме основной. Вывод локализованных сообщений при этом идёт в cp1251.

Пока это можно списать на внутренний механизм PHP работы со строками. С шестой версии PHP вся обработка строк должна будет вестись в UTF-8, но до тех пор надо просто знать об этом и делать поправку.

Ещё одной странностью при работе с локалями в PHP на Windows является неправильная работа с категориями локалей. Так, например, я выставляю локаль на функции времени KOI8-R, setlocale(LC_TIME, ‘Russian_Russia.20866’) , но почему-то выставляется cp1251 на все категории. Суть проблемы я так и не понял, возможно, это просто баг (проверялось на PHP 5.2.3), а возможно, что внутренний механизм Windows просто не позволяет этого делать. Хотя по мне, так это чистой воды баг.

В общем-то, на этом можно и закончить разговор о локалях на Windows. Главное, запомнить, что локали, которые портированы из UNIX, под WIndows работают только для «галочки». Шаг влево, шаг вправо и результат будет непредсказуемым. Безопасно можно использовать только cp1251 (windows-1251) и KOI8-R, и только для LC_ALL .

Локали в UNIX

Выше я описал работу с локалями в Windows, теперь можно заострить внимание на UNIX-like системах. Для простоты, я буду их называть UNIX, а подразумевать FreeBSD :). В контексте данной статьи это не особо важно.

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

Так может выглядеть работа системной команды locale , которая выводит текущие настройки локали для пользователя. А так, обычно, выглядят настройки локали для пользователя, под которым работает PHP:

Функция ucwords() должна была сделать заглавными первые буквы всех слов. А перед этим strtolower() должна была предварительно все заглавные буквы сделать строчными. Но ничего не произошло. Так же не будет работать следующий код:

Хотя \w является множеством знаков, из которых может состоять слово (алфавит, цифры и _), регулярное выражение не срабатывает. Причина как раз в том, что, работая с cp1251, мы не сказали об этом php. Чтобы исправить положение, достаточно воспользоваться функцией setlocale() и указать правильную локаль, например, так:

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

С помощью команды grep я отобрал локали, которые поддерживают русский язык. Любую из них можно использовать, однако следует понимать, что данные должны быть в кодировке, на которую рассчитана локаль. Если же это правило не будет соблюдено, то результат может оказаться весьма неожиданным:

Если учесть, что koi8-r достаточно популярная кодировка для UNIX-севреров, а windows-1251 для русскоязычных сайтов, то подобное «необычное» поведение не такая уж и редкость. Когда-то я и сам столкнулся с этой проблемой при портировании проекта на реальный хостинг.

После установки правильной локали все примеры, которые не работали выше, будут работать как нужно!

По-русски заговорит и функция strftime(), которая корректно работает с локалями, а также и всё остальное, что зависит от локали.

Кодировки в MySQL

Напомню, что возможность задавать кодировки появилась только в MySQL 4.1.11 и выше.

В отличие от php, проблемы с кодировками базы данных проявляют себя гораздо быстрее, чем проблемы с локалью. И связано это прежде всего с хранением и выборкой данных, поскольку от этого зависит информация на сайте. Я не буду подробно расписывать все тонкости, поскольку есть отдельная статья, остановлюсь на самых важных моментах.

Первое, чему необходимо научиться, смотреть текущие настройки соединения с mysql:

Критичными для пользователя являются character_set_client и character_set_results, которые отвечают за кодировку, в которой данные поступают в базу, и кодировку, в которой данные поступают из базы к пользователю. Если эти две кодировки отличаются от той, в которой работает клиент, в нашем случае php-скрипты, то неминуемо будут «странности», например, при сортировке выборки или внесении данных в базу.

Второе, что необходимо знать, как правильно сообщить mysql о кодировках. Самый простой и правильный способ, это использовать запрос set names:

После этого три переменные character_set_client, character_set_connection и character_set_results примут значение cp1251. Это будет означать — клиент работает в кодировке windows-1251 (cp1251).

Помимо этого можно устанавливать непосредственно серверные переменные:

Теперь данные поступают и извлекаются в разных кодировках.

Список доступных кодировок можно просмотреть так:

И третье, что необходимо знать, — правила создания таблиц для хранения данных в нужной кодировке. К слову, данные можно хранить в любой кодировке, а работать с ними в кодировке клиента. Однако, важно понимать, что кодировки носят национальный характер и должны соответствовать вносимым данным. Иначе будут потери. Для русского языка есть три национальных кодировки koi8r, cp866, cp1251, которые могут конвертироваться друг в друга без потерь. Также можно использовать интернациональную кодировку UTF8.

Кодировку можно выставить на базу данных, таблицу и поле таблицы. Так, например, можно создать базу данных в кодировке koi8r:

Следует отметить, что кодировка базы данных влияет только на дефолтные значения кодировок при создании таблиц. Это значит, что неважно в какой кодировке была создана база, если кодировка таблицы была задана явно. Это же правило относится и к полям таблицы.

Следующим шагом я создам таблицу в cp1251 и одним полем в utf8:

После того, как таблица создана с нужными параметрами кодировки, mysql автоматически начинает переводить данные при внесении и выборке.

Данные хранятся в разном виде, но поступают к пользователю именно так, как надо!

Подробнее с кодировками и проблемами их использования можно ознакомиться на http://dev.mysql.com/doc/refman/5.1/en/charset.html.

Кодировка HTML-страниц

Объявить кодировку html-страницы можно двумя способами: через заголовки и мета-тег в самой странице. Мета-тег используется только в статичных страницах.

Я не буду его разбирать, это проблемы html. Во всех остальных случаях предпочтительней использовать HTTP-заголовок Content-Type.

PHP позволяет работать с HTTP-заголовками посредством функции header():

Но браузер отобразит страницу корректно только в том случае, когда php-файлы сами были созданы в кодировке cp1251. Также нужно понимать, что заголовки должны быть отправлены до любого вывода на экран.

При необходимости перекодировать страницы «на лету», достаточно воспользоваться буферизацией и iconv:

Надпись «Привет, мир!» будет выведена в юникоде, при этом браузер получит информацию о кодировке через заголовки и правильно отобразит страницу. Но важно понимать, что внутри скрипта и при соединении с базой данных надо использовать windows-1251 (cp1251), поскольку страница должна быть сформирована в одной кодировке.

Важно помнить, что функции iconv доступны не всегда, и проверка на доступность этих функций не будет лишней.

Заключение

Для безопасной разработки русскоязычных веб-проектов необходимо включать в файл с общими настройками следующие команды:

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

© 2021 Антон Прибора. При копировании материалов с сайта, пожалуйста, указывайте ссылку на источник.

setlocale — Устанавливает настройки локали

(PHP 4, PHP 5, PHP 7)

setlocale — Устанавливает настройки локали

Описание

Устанавливает настройки локали.

Список параметров

Параметр category это именованная константа, определяющая категорию функций, на которые будет влиять установка локали:

  • LC_ALL — все нижеперечисленное
  • LC_COLLATE — функции сравнения строк, смотри strcoll()
  • LC_CTYPE — функции преобразования и классификации строк, например strtoupper()
  • LC_MONETARY — для функции localeconv()
  • LC_NUMERIC — задает символ десятичного разделения (см. также localeconv() )
  • LC_TIME — форматирование даты/времени функцией strftime()
  • LC_MESSAGES для системных сообщений (доступна если PHP был скомпилирован с поддержкой libintl)

Если в качестве locale передана пустая строка «» или NULL , имена локалей будут взяты из одноименных переменных окружения или переменной с именем «LANG».

Если в качестве locale передан NULL или «0», локаль изменена не будет, а будет возвращено текущее значение.

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

(Необязательные аргументы в виде строк или массивов для установки настроек локали до первой успешной попытки.)

На Windows, setlocale(LC_ALL, ») устанавливает имена локалей из системных региональных/языковых настроек (доступных через Панель Управления).

Возвращаемые значения

Возвращает имя вновь установленной локали или FALSE если система не поддерживает установку локали, указанная локаль не существует или передано недопустимое имя категории.

Недопустимое имя категории также вызывает предупреждение. Имена локалей и категорий описаны в » RFC 1766 и » ISO 639. Разные системы имеют различных схемы именования локалей.

Возвращаемое функцией setlocale() значение зависит от системы, на которой запущен PHP. Она возвращает точно то же значение, что и системная функция setlocale.

Список изменений

Версия Описание
5.3.0 Эта функция в настоящее время бросает уведомления E_DEPRECATED , если строка передается в параметре category вместо одной из констант LC_*.

Примеры

Пример #1 Примеры использования setlocale()

/* Установка голландской локали */
setlocale ( LC_ALL , ‘nl_NL’ );

/* выводит: vrijdag 22 december 1978 */
echo strftime ( «%A %e %B %Y» , mktime ( 0 , 0 , 0 , 12 , 22 , 1978 ));

/* попытка использовать различные локали для немецкого языка (с PHP 4.3.0) */
$loc_de = setlocale ( LC_ALL , ‘de_DE@euro’ , ‘de_DE’ , ‘de’ , ‘ge’ );
echo «На этой системе немецкая локаль имеет имя ‘ $loc_de ‘» ;
?>

Пример #2 Примеры использования setlocale() в Windows

/* Установка голландской локали */
setlocale ( LC_ALL , ‘nld_nld’ );

/* выводит: vrijdag 22 december 1978 */
echo strftime ( «%A %d %B %Y» , mktime ( 0 , 0 , 0 , 12 , 22 , 1978 ));

/* попытка использовать различные локали для немецкого языка (с PHP 4.3.0) */
$loc_de = setlocale ( LC_ALL , ‘de_DE@euro’ , ‘de_DE’ , ‘deu_deu’ );
echo «Предпочитаемая немецкая локаль на этой системе: ‘ $loc_de ‘» ;
?>

Примечания

Информация о локали модифицируется во всем процессе, а не по каждому потоку отдельно. Если вы используете PHP на многопоточном сервере, таком как IIS, HHVM или Apache под Windows, вы можете обнаружить неожиданные изменения в настройках локали во время выполнения скриптов, никогда и не вызывавших setlocale() . Это происходит из-за того, что другие скрипты, запущенные в параллельных потоках данного процесса, в то же самое время поменяли настройки локали для всего процесса с помощью setlocale() .

Пользователи Windows найдут полезной информацию о значениях locale на сайте Microsoft MSDN . Поддерживаемые языки перечислены в » документации по языковым строкам, а значения стран/регионов в » документации по строкам стран/регионов.

setlocale, _wsetlocale setlocale, _wsetlocale

Устанавливает или извлекает языковой стандарт времени выполнения. Sets or retrieves the run-time locale.

Синтаксис Syntax

Параметры Parameters

категори category
Категория, на которую влияет языковой стандарт. Category affected by locale.

языкового стандарта locale
Указатель языкового стандарта. Locale specifier.

Возвращаемое значение Return value

Если заданы допустимые язык и региональные параметры и Категория , возвращает указатель на строку, связанную с заданным языковым стандартом и категорией. If a valid locale and category are given, returns a pointer to the string associated with the specified locale and category. Если языковой стандарт или Категория недействительна, возвращает пустой указатель, а текущие параметры языкового стандарта программы не изменяются. If the locale or category isn’t valid, returns a null pointer, and the current locale settings of the program are unchanged.

Например, вызов For example, the call

задает все категории, возвращая только строку sets all categories, returning only the string

Можно скопировать строку, возвращенную setlocale , для восстановления этой части данных о языковом стандарте программы. You can copy the string returned by setlocale to restore that part of the program’s locale information. Глобальное или локальное хранилище потока используется для строки, возвращаемой setlocale . Global or thread local storage is used for the string returned by setlocale . Последующие вызовы setlocale перезаписывают эту строку, что аннулирует указатели строк, возвращенные предыдущими вызовами. Later calls to setlocale overwrite the string, which invalidates string pointers returned by earlier calls.

Remarks Remarks

Используйте setlocale функцию, чтобы задать, изменить или запросить некоторые или все сведения о языковом стандарте текущей программы, указанные в параметрах locale и Category. Use the setlocale function to set, change, or query some or all of the current program locale information specified by locale and category. языковой стандарт — это локальность (страна, регион и язык), для которой можно настроить определенные аспекты программы. locale refers to the locality (country/region and language) for which you can customize certain aspects of your program. К некоторым категориям, зависящим от языкового стандарта, относится формат дат и отображения денежных значений. Some locale-dependent categories include the formatting of dates and the display format for monetary values. Если для языкового стандарта задана строка по умолчанию для языка с несколькими формами, поддерживаемыми на компьютере, следует проверить setlocale возвращаемое значение, чтобы узнать, какой язык действует. If you set locale to the default string for a language that has multiple forms supported on your computer, you should check the setlocale return value to see which language is in effect. Например, если задать для параметра locale значение «Китайский», то возвращаемым значением может быть «китайский-упрощенный» или «Китайский (традиционное письмо)». For example, if you set locale to «chinese» the return value could be either «chinese-simplified» or «chinese-traditional».

_wsetlocale — Это версия с расширенными символами setlocale ; аргумент локали и возвращаемое значение _wsetlocale являются строками расширенных символов. _wsetlocale is a wide-character version of setlocale ; the locale argument and return value of _wsetlocale are wide-character strings. Поведение _wsetlocale и setlocale идентично в противном случае. _wsetlocale and setlocale behave identically otherwise.

По умолчанию глобальное состояние этой функции ограничивается приложением. By default, this function’s global state is scoped to the application. Чтобы изменить это, см. раздел глобальное состояние в CRT. To change this, see Global state in the CRT.

Универсальное текстовое сопоставление функций Generic-Text Routine Mappings

Подпрограмма TCHAR.H TCHAR.H routine _UNICODE и _MBCS не определены _UNICODE & _MBCS not defined _MBCS определено _MBCS defined _UNICODE определено _UNICODE defined
_tsetlocale setlocale setlocale _wsetlocale

Аргумент Category определяет части информации о языковом стандарте программы, которые затрагиваются. 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:

флаг категории category flag Область применения Affects
LC_ALL Все категории, перечисленные ниже. All categories, as listed below.
LC_COLLATE Функции strcoll , _stricoll , wcscoll , _wcsicoll , strxfrm , _strncoll , _strnicoll , _wcsncoll , _wcsnicoll и wcsxfrm . The strcoll , _stricoll , wcscoll , _wcsicoll , strxfrm , _strncoll , _strnicoll , _wcsncoll , _wcsnicoll , and wcsxfrm functions.
LC_CTYPE Функции обработки символов (за исключением isdigit , isxdigit , mbstowcs и mbtowc , которые не затрагиваются). The character-handling functions (except isdigit , isxdigit , mbstowcs , and mbtowc , which are unaffected).
LC_MONETARY Информация о форматировании денежных значений, возвращаемая функцией localeconv . Monetary-formatting information returned by the localeconv function.
LC_NUMERIC Символ десятичного разделителя для информации процедур форматированного вывода (например, printf ), для процедур преобразования данных и для форматирования не относящихся к денежным значений, возвращаемой localeconv . Decimal-point character for the formatted output routines (such as printf ), for the data-conversion routines, and for the non-monetary formatting information returned by localeconv . Помимо символа десятичного разделителя LC_NUMERIC также задает разделитель тысяч и строку элемента управления группировкой, возвращаемую localeconv. In addition to the decimal-point character, LC_NUMERIC sets the thousands separator and the grouping control string returned by localeconv.
LC_TIME Функции strftime и wcsftime . The strftime and wcsftime functions.

Эта функция проверяет параметр категории. This function validates the category parameter. Если параметр category не является одним из значений, указанных в предыдущей таблице, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. If the category parameter isn’t one of the values given in the previous table, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено, эта функция задает для errno значение EINVAL и возвращает NULL . If execution is allowed to continue, the function sets errno to EINVAL and returns NULL .

Аргумент locale является указателем на строку, указывающую языковой стандарт. 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. Если аргумент locale указывает на пустую строку, языковой стандарт соответствует исходной среде, определенной реализацией. If locale points to an empty string, the locale is the implementation-defined native environment. Значение C задает минимальную подходящую ANSI среду для переноса C. A value of C specifies the minimal ANSI conforming environment for C translation. Языковой стандарт C предполагает, что все типы данных char соответствуют 1 байту, а их значение всегда меньше 256. 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» );

Аргумент locale может принимать имя локали, строку языка, языковую строку и код страны или региона, кодовую страницу, языковую строку, код страны или региона и кодовую страницу. 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. Набор доступных имен языковых стандартов, языков, кодов стран и регионов, а также кодовых страниц включает все поддерживаемые API NLS Windows. The set of available locale names, languages, country/region codes, and code pages includes all those supported by the Windows NLS API. Набор имен языковых стандартов, поддерживаемых setlocale , см. в разделе Строки имени языкового стандарта, языка и страны и региона. The set of locale names supported by setlocale are described in Locale Names, Languages, and Country/Region Strings. Набор строковых значений языка и страны или региона, поддерживаемых setlocale , представлен в разделах Строки языка и Строки страны или региона. 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.

Указатель null, который передается в качестве аргумента локали , указывает setlocale на запрос, а не на установку международного окружения. A null pointer that’s passed as the locale argument tells setlocale to query instead of to set the international environment. Если аргумент locale является пустым указателем, текущее значение языкового стандарта программы не меняется. If the locale argument is a null pointer, the program’s current locale setting isn’t changed. Вместо этого setlocale возвращает указатель на строку, связанную с категорией текущего языкового стандарта потока. Instead, setlocale returns a pointer to the string that’s associated with the category of the thread’s current locale. Если аргумент Category имеет значение LC_ALL , функция возвращает строку, указывающую текущее значение каждой категории, разделенную точкой с запятой. If the category argument is LC_ALL , the function returns a string that indicates the current setting of each category, separated by semicolons. Например, последовательность вызовов For example, the sequence of calls

и это строка, связанная с категорией LC_ALL . which is the string that’s associated with the LC_ALL category.

Следующие примеры относятся к категории LC_ALL . The following examples pertain to the LC_ALL category. Любая из строк «. OCP «и». ACP» можно использовать вместо номера кодовой страницы для указания использования пользовательской кодовой страницы OEM по умолчанию и кодовой страницы ANSI по умолчанию для этого имени языкового стандарта соответственно. 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.

Задает языковой стандарт по умолчанию, т.е. заданную по умолчанию для пользователя кодовую страницу ANSI, полученную от операционной системы. Sets the locale to the default, which is the user-default ANSI code page obtained from the operating system. Для имени языкового стандарта задается значение, возвращаемое функцией жетусердефаултлокаленаме. The locale name is set to the value returned by GetUserDefaultLocaleName. Кодовая страница задается значением, возвращаемым функцией жетакп. The code page is set to the value returned by GetACP.

setlocale( LC_ALL, «.OCP» );

Задает языковой стандарт для текущей кодовой страницы OEM, полученной от операционной системы. Sets the locale to the current OEM code page obtained from the operating system. Для имени языкового стандарта задается значение, возвращаемое функцией жетусердефаултлокаленаме. The locale name is set to the value returned by GetUserDefaultLocaleName. Кодовая страница задается в качестве значения LOCALE_IDEFAULTCODEPAGE для имени локали пользователя по умолчанию по GetLocaleInfoEx. The code page is set to the LOCALE_IDEFAULTCODEPAGE value for the user-default locale name by GetLocaleInfoEx.

setlocale( LC_ALL, «.ACP» );

Задает языковой стандарт согласно текущей кодовой странице ANSI, полученной от операционной системы. Sets the locale to the ANSI code page obtained from the operating system. Для имени языкового стандарта задается значение, возвращаемое функцией жетусердефаултлокаленаме. The locale name is set to the value returned by GetUserDefaultLocaleName. Кодовая страница задается в качестве значения LOCALE_IDEFAULTANSICODEPAGE для имени локали пользователя по умолчанию по GetLocaleInfoEx. The code page is set to the LOCALE_IDEFAULTANSICODEPAGE value for the user-default locale name by GetLocaleInfoEx.

Задает языковой стандарт для имени языкового стандарта, указанного в . Sets the locale to the locale name that’s indicated by . Кодовая страница задается в качестве значения LOCALE_IDEFAULTANSICODEPAGE для указанного имени локали по GetLocaleInfoEx. The code page is set to the LOCALE_IDEFAULTANSICODEPAGE value for the specified locale name by GetLocaleInfoEx.

setlocale( LC_ALL, » _ » );

Задает языковой стандарт и страну или регион, указанные в параметре и, а также кодовую страницу по умолчанию, полученную из операционной системы узла. Sets the locale to the language and country/region indicated by and , together with the default code page obtained from the host operating system. Кодовая страница задается в качестве значения LOCALE_IDEFAULTANSICODEPAGE для указанного имени локали по GetLocaleInfoEx. The code page is set to the LOCALE_IDEFAULTANSICODEPAGE value for the specified locale name by GetLocaleInfoEx.

setlocale( LC_ALL, » _ . » );

Задает языковой стандарт для языка, страны или региона, а также кодовую страницу, определяемую строками, и. Sets the locale to the language, country/region, and code page indicated by the , , and strings. Можно использовать различные сочетания языка, страны или региона и кодовой страницы. You can use various combinations of language, country/region, and code page. Например, этот вызов устанавливает языковой стандарт «французский (Канада)» с кодовой страницей 1252. For example, this call sets the locale to French Canada with code page 1252:

setlocale( LC_ALL, «French_Canada.1252» );

Этот вызов устанавливает языковой стандарт «французский (Канада)» с кодовой страницей по умолчанию ANSI. This call sets the locale to French Canada with the default ANSI code page:

setlocale( LC_ALL, «French_Canada.ACP» );

Этот вызов устанавливает языковой стандарт «французский (Канада)» с кодовой страницей по умолчанию OEM. This call sets the locale to French Canada with the default OEM code page:

setlocale( LC_ALL, «French_Canada.OCP» );

Устанавливает языковой стандарт для языка, указанного в параметре , и использует страну или регион по умолчанию для указанного языка и кодовую страницу пользователя по умолчанию ANSI для этой страны или региона, полученную из операционной системы узла. Sets the locale to the language that’s indicated by , and uses the default country/region for the specified language and the user-default ANSI code page for that country/region as obtained from the host operating system. Например, следующие вызовы setlocale функционально эквивалентны: For example, the following calls to setlocale are functionally equivalent:

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.

Задает кодовую страницу согласно значению, отображаемому , вместе с языком и страной или регионом по умолчанию (согласно определению операционной системы) для заданной кодовой страницы. Sets the code page to the value indicated by , together with the default country/region and language (as defined by the host operating system) for the specified code page.

Эта категория должна быть LC_ALL или LC_CTYPE для реализации изменения кодовой страницы. The category must be either LC_ALL or LC_CTYPE to effect a change of code page. Например, если страной и языком по умолчанию операционной системы являются «США» и «английский», следующие два вызова setlocale функционально эквивалентны: 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»);

Дополнительные сведения см. в описании setlocale директивы pragma в справочнике по препроцессору C/C++. For more information, see the setlocale pragma directive in the C/C++ Preprocessor Reference.

Функция _configthreadlocale используется в для определения того, влияет ли setlocale на языковой стандарт всех потоков в программе или только на языковой стандарт вызывающего потока. 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 UTF-8 Support

Начиная с Windows 10 Build 17134 (обновление от апреля 2018), универсальная среда выполнения C поддерживает использование кодовой страницы UTF-8. Starting in Windows 10 build 17134 (April 2018 Update), the Universal C Runtime supports using a UTF-8 code page. Это означает, что char строки, передаваемые в функции среды выполнения C, будут ждать строк в кодировке UTF-8. This means that char strings passed to C runtime functions will expect strings in the UTF-8 encoding. Чтобы включить режим UTF-8, используйте «UTF-8» в качестве кодовой страницы при использовании setlocale . To enable UTF-8 mode, use «UTF-8» as the code page when using setlocale . Например, setlocale(LC_ALL, «.utf8») будет использовать текущую кодовую страницу ANSI Windows (ACP) по умолчанию для языкового стандарта и кодировку UTF-8 для кодовой страницы. For example, setlocale(LC_ALL, «.utf8») will use the current default Windows ANSI code page (ACP) for the locale and UTF-8 for the code page.

После вызова setlocale(LC_ALL, «.UTF8″) вы можете передать » 😊 » в, mbtowcs и он будет правильно преобразован в wchar_t строку, в то время как ранее для этого не существовал параметр языкового стандарта. After calling setlocale(LC_ALL, «.UTF8») , you may pass «😊» to mbtowcs and it will be properly translated to a wchar_t string, whereas previously there was not a locale setting available to do this.

Режим UTF-8 также включается для функций с историческим переводом char строк с помощью кодовой страницы Windows ANSI по умолчанию (ACP). UTF-8 mode is also enabled for functions that have historically translated char strings using the default Windows ANSI code page (ACP). Например, вызов _mkdir(«😊») при использовании кодовой страницы UTF-8 правильно создаст каталог с этим символом эмодзи в качестве имени папки, а не требует, чтобы ACP был изменен на UTF-8 перед запуском программы. 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 prior to running your program. Аналогичным образом, вызов _getcwd() внутри этой папки вернет строку в кодировке UTF-8. Likewise, calling _getcwd() inside of that folder will return a UTF-8 encoded string. Для обеспечения совместимости ACP по-прежнему используется, если кодовая страница языка C не имеет значение UTF-8. For compatibility, the ACP is still used if the C locale code page is not set to UTF-8.

Следующие аспекты среды выполнения C не могут использовать кодировку UTF-8, так как они задаются во время запуска программы и должны использовать кодовую страницу ANSI Windows по умолчанию (ACP): __argv , _acmdln и _pgmptr . The following aspects of the C Runtime that are not able to use UTF-8 because they are set during program startup and must use the default Windows ANSI code page (ACP): __argv , _acmdln , and _pgmptr .

Предыдущая поддержка этой поддержки mbrtoc16 , mbrtoc32 ,, c16rtomb и c32rtomb существовала для преобразования между строками UTF-8, UTF-16 (то же кодирование, что и wchar_t на платформах Windows) и UTF-32. Previous to this support, mbrtoc16 , mbrtoc32 , c16rtomb , and c32rtomb existed to translate between UTF-8 narrow strings, UTF-16 (same encoding as wchar_t on Windows platforms) and UTF-32. По соображениям совместимости эти API-интерфейсы переводятся только в кодировку UTF-8 и не задаются кодовой страницей с помощью setlocale . For compatibility reasons, these APIs still only translate to and from UTF-8 and not the code page set via setlocale .

Чтобы использовать эту функцию в ОС до Windows 10, например Windows 7, необходимо использовать Локальное развертывание приложения или компоновку, используя версию 17134 Windows SDK или более позднюю. To use this feature on an OS prior to Windows 10, such as Windows 7, you must use app-local deployment or link statically using version 17134 of the Windows SDK or later. Для операционных систем Windows 10 до 17134 поддерживается только статическая компоновка. For Windows 10 operating systems prior to 17134, only static linking is supported.

Требования Requirements

Подпрограмма Routine Обязательный заголовок Required header
setlocale
_wsetlocale или or

Дополнительные сведения о совместимости см. в статье Compatibility. For additional compatibility information, see Compatibility.

Читайте также:  Как установить elive linux
Оцените статью