setlocale
, _wsetlocale
Defina ou recupere a localidade de tempo de execução.
Sintaxe
char *setlocale(
int category,
const char *locale
);
wchar_t *_wsetlocale(
int category,
const wchar_t *locale
);
Parâmetros
category
Categoria afetada pela localidade.
locale
Especificador de localidade.
Valor retornado
Se um valid locale
e category
for fornecido, as funções retornarão um ponteiro para a cadeia de caracteres associada ao especificado locale
e category
.
Se o locale
argumento for NULL
, as funções retornarão a localidade atual.
Se um argumento inválido for passado para qualquer uma das funções, o valor retornado será NULL
.
O comportamento para argumentos inválidos é o seguinte:
Função | Parâmetro inválido | Manipulador inválido invocado conforme descrito em Validação de parâmetro | Define errno |
---|---|---|---|
setlocale |
category |
sim | sim |
setlocale |
locale |
não | não |
_wsetlocale |
category |
sim | sim |
_wsetlocale |
locale |
não | não |
A chamada:
setlocale( LC_ALL, "en-US" );
define todas as categorias, retornando apenas a cadeia de caracteres
en-US
Você pode copiar a cadeia de caracteres retornada por setlocale
para restaurar essa parte das informações de localidade do programa. O armazenamento de thread local ou global é usado para a cadeia de caracteres retornada por setlocale
. As chamadas posteriores para setlocale
substituirão a cadeia de caracteres, o que invalida os ponteiros de cadeia de caracteres retornados pelas chamadas anteriores.
Comentários
Use a função setlocale
para definir, modificar ou consultar algumas ou todas as informações de localidade do programa atual especificadas por locale
e category
. locale
refere-se à localidade (país/região e idioma) para a qual você pode personalizar alguns aspectos do programa. Algumas categorias de localidade dependentes incluem a formatação de datas e o formato de exibição de valores monetários. Se você definir locale
como a cadeia de caracteres padrão para um idioma que tenha várias formas com suporte em seu computador, verifique o valor de retorno de setlocale
para ver que idioma é aplicado. Por exemplo, se você definir locale
como "chinese"
o valor retornado poderá ser "chinese-simplified"
ou "chinese-traditional"
.
_wsetlocale
é uma versão caracteres largos de setlocale
; o argumento locale
e o valor de retorno de _wsetlocale
são cadeias de caracteres largos. Caso contrário, _wsetlocale
e setlocale
se comportam de forma idêntica.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.
Mapeamentos de rotina de texto genérico
Rotina TCHAR.H |
_UNICODE e _MBCS não definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tsetlocale |
setlocale |
setlocale |
_wsetlocale |
O argumento category
especifica as partes das informações de localidade de um programa que são afetadas. As macros usadas para category
e as partes de programa que afetam são:
Sinalizador category |
Afeta |
---|---|
LC_ALL |
Todas as categorias, conforme listado abaixo. |
LC_COLLATE |
As funções strcoll , _stricoll , wcscoll , _wcsicoll , strxfrm , _strncoll , _strnicoll , _wcsncoll , _wcsnicoll e wcsxfrm . |
LC_CTYPE |
As funções de manipulação de caracteres (exceto isdigit , isxdigit , mbstowcs e mbtowc , que não são afetadas). |
LC_MONETARY |
Informações de formatação monetária retornadas pela função localeconv . |
LC_NUMERIC |
Caractere de ponto decimal para as rotinas de saída formatadas (como printf ), para as rotinas de conversão de dados e para as informações de formatação não monetária retornadas por localeconv . Além do caractere de ponto decimal, LC_NUMERIC define o separador de milhares e a cadeia de caracteres de controle de agrupamento retornada por localeconv . |
LC_TIME |
As funções strftime e wcsftime . |
Essa função valida o parâmetro category. Se o parâmetro de categoria não for um dos valores fornecidos na tabela anterior, o manipulador de parâmetro inválido será invocado, conforme descrito em Validação de parâmetro. Se a execução puder continuar, a função definirá errno
como EINVAL
e retornará NULL
.
O argumento locale
é um ponteiro para uma cadeia de caracteres que especifica a localidade. Para obter informações sobre o formato do argumento, consulte Nomes de localidade, Idiomas e Cadeias de locale
caracteres de País/Região. Se locale
apontar para uma cadeia de caracteres vazia, a localidade será o ambiente nativo definido pela implementação. Um valor de C
especifica o ambiente em conformidade mínima com ANSI para a conversão em C. A localidade C
pressupõe que todos os tipos de dados char
tenham 1 byte e seu valor seja sempre menor que 256.
Na inicialização do programa, o equivalente da instrução a seguir é executado:
setlocale( LC_ALL, "C" );
O argumento locale
pode ter um nome de localidade, uma cadeia de caracteres de idioma, uma cadeia de caracteres de idioma e código de país/região, uma página de código ou uma cadeia de caracteres de idioma, código de país/região e página de código. Os nomes de localidade, idiomas, códigos de país/região e páginas de código disponíveis incluem todos os compatíveis com a API NLS do Windows. O conjunto de nomes de localidade com suporte é setlocale
descrito em Nomes de localidade, Idiomas e cadeias de caracteres de País/Região. O conjunto de cadeias de caracteres de idioma e país/região com suporte está setlocale
listado em Cadeias de caracteres de idioma e Cadeias de caracteres de país/região. Recomendamos o formato do nome da localidade para o desempenho e a capacidade de manutenção de cadeias de caracteres de localidade inseridas no código ou serializadas para armazenamento. As cadeias de caracteres de nome da localidade são menos prováveis de ser alteradas por uma atualização do sistema operacional do que o formato de idioma e país/região.
Um ponteiro nulo que é passado quando o argumento locale
diz para setlocale
consultar em vez de para definir o ambiente internacional. Se o argumento locale
for um ponteiro nulo, a configuração de localidade atual do programa não será alterada. Em vez disso, setlocale
retorna um ponteiro para a cadeia de caracteres associada a category
de localidade do thread atual. Se o argumento category
for LC_ALL
, a função retornará uma cadeia de caracteres que indica a configuração atual de cada categoria, separada por ponto-e-vírgula. Por exemplo, a sequência de chamadas
// Set all categories and return "en-US"
setlocale(LC_ALL, "en-US");
// Set only the LC_MONETARY category and return "fr-FR"
setlocale(LC_MONETARY, "fr-FR");
printf("%s\n", setlocale(LC_ALL, NULL));
returns
LC_COLLATE=en-US;LC_CTYPE=en-US;LC_MONETARY=fr-FR;LC_NUMERIC=en-US;LC_TIME=en-US
qual é a cadeia de caracteres associada à categoria LC_ALL
.
Os exemplos a seguir pertencem à categoria LC_ALL
. Qualquer uma das cadeias de caracteres “.OCP” e “.ACP” pode ser usada em vez de um número de página de código para especificar o uso da página de código OEM do usuário padrão e da página de código ANSI padrão do usuário para o nome da localidade, respectivamente.
setlocale( LC_ALL, "" );
Define a localidade para o padrão, que é a página de código ANSI padrão do usuário obtida do sistema operacional. O nome da localidade é definido como o valor retornado por
GetUserDefaultLocaleName
. A página de código é definida como o valor retornado porGetACP
.setlocale( LC_ALL, ".OCP" );
Define a localidade para a página de código OEM obtida do sistema operacional. O nome da localidade é definido como o valor retornado por
GetUserDefaultLocaleName
. A página de código é definida como o valorLOCALE_IDEFAULTCODEPAGE
do nome da localidade padrão do usuário porGetLocaleInfoEx
.setlocale( LC_ALL, ".ACP" );
Define a localidade para a página de código ANSI obtida do sistema operacional. O nome da localidade é definido como o valor retornado por
GetUserDefaultLocaleName
. A página de código é definida como o valorLOCALE_IDEFAULTANSICODEPAGE
do nome da localidade padrão do usuário porGetLocaleInfoEx
.setlocale( LC_ALL, "<localename>" );
Define a localidade para o nome da localidade que é indicado por
<localename>
. A página de código é definida como o valorLOCALE_IDEFAULTANSICODEPAGE
do nome da localidade especificado porGetLocaleInfoEx
.setlocale( LC_ALL, "<language>_<country>" );
Define a localidade para o idioma e o país/região indicados por
<language>
e<country>
, juntamente com a página de código padrão obtida do sistema operacional do host. A página de código é definida como o valorLOCALE_IDEFAULTANSICODEPAGE
do nome da localidade especificado porGetLocaleInfoEx
.setlocale( LC_ALL, "<language>_<country>.<code_page>" );
Define a localidade para o idioma, o país/região e a página de código indicados pelas cadeias de caracteres
<language>
,<country>
e<code_page>
. Você pode usar várias combinações de idioma, país/região e página de código. Por exemplo, esta chamada define a localidade para francês canadense com a página de código 1252:setlocale( LC_ALL, "French_Canada.1252" );
Esta chamada define a localidade para francês canadense com a página de código ANSI padrão:
setlocale( LC_ALL, "French_Canada.ACP" );
Esta chamada define a localidade para francês canadense com a página de código OEM padrão:
setlocale( LC_ALL, "French_Canada.OCP" );
setlocale( LC_ALL, "<language>" );
Define a localidade para o idioma que é indicado por
<language>
e usa o país/região padrão para o idioma especificado e a página de código ANSI padrão do usuário para esse país/região conforme obtidos do sistema operacional do host. Por exemplo, as seguintes chamadas parasetlocale
são funcionalmente equivalentes:setlocale( LC_ALL, "en-US" );
setlocale( LC_ALL, "English" );
setlocale( LC_ALL, "English_United States.1252" );
Recomendamos o primeiro formato para o desempenho e a capacidade de manutenção.
setlocale( LC_ALL, ".<code_page>" );
Define a página de código para o valor indicado por
<code_page>
, juntamente com o país/região e o idioma padrão (conforme definidos pelo sistema operacional do host) para a página de código especificada.
A categoria deve ser LC_ALL
ou LC_CTYPE
para efetivar uma alteração de página de código. Por exemplo, se o país/região e o idioma padrão do sistema operacional do host forem 'United States
' e 'English
', as duas chamadas a seguir para setlocale
serão funcionalmente equivalentes:
setlocale( LC_ALL, ".1252" );
setlocale( LC_ALL, "English_United States.1252");
Para obter mais informações, confira a diretiva de pragma setlocale
na Referência de pré-processador C/C++.
A função _configthreadlocale
é usada para controlar se setlocale
afeta a localidade de todos os threads em um programa ou somente a localidade do thread da chamada.
Suporte para UTF-8
A partir da versão 1803 do Windows 10 (10.0.17134.0), o Universal C Runtime dá suporte ao uso de uma página de código UTF-8. A alteração significa que char
as cadeias de caracteres passadas para funções de tempo de execução C podem esperar cadeias de caracteres na codificação UTF-8. Para habilitar o modo UTF-8, use ".UTF8"
como a página de código ao usar setlocale
. Por exemplo, setlocale(LC_ALL, ".UTF8")
usa a ACP (página de código) ANSI padrão atual do Windows para a localidade e UTF-8 para a página de código.
A cadeia de caracteres para especificar o modo UTF-8 é:
- não diferenciam maiúsculas de minúsculas
- o hífen (
-
) é opcional - Ele deve estar na parte da página de código do nome da localidade, portanto, deve ter um ponto à esquerda (
.
) como nestes exemplos:"en_US.UTF8"
ou".utf8"
Os exemplos a seguir mostram como especificar a cadeia de caracteres UTF-8:
".UTF8"
".UTF-8"
".utf8"
".utf-8"
"en_us.utf8"
"ja_JP.Utf-8"
Depois de chamar setlocale(LC_ALL, ".UTF8")
, você pode passar "😊" para mbtowcs
e ele será traduzido corretamente em uma wchar_t
string. Anteriormente, não havia uma configuração de localidade disponível para fazer essa tradução.
O modo UTF-8 também está habilitado para funções que têm cadeias de caracteres char
historicamente convertidas usando a ACP (página de código ANSI) padrão do Windows. Por exemplo, chamar _mkdir("😊")
ao usar uma página de código UTF-8 produzirá corretamente um diretório com esse emoji como o nome da pasta, em vez de exigir que a ACP seja alterada para UTF-8 antes de executar seu programa. Da mesma forma, chamar _getcwd()
essa pasta retorna uma cadeia de caracteres codificada em UTF-8. Para compatibilidade, o ACP ainda será usado se a página de código de localidade C não estiver definida como UTF-8.
Os seguintes aspectos do C Runtime não podem usar a UTF-8 porque são definidos durante a inicialização do programa e devem usar a ACP (página de código ANSI) padrão do Windows: __argv
, _acmdln
, and _pgmptr
.
Anterior a esse suporte, mbrtoc16
, mbrtoc32
c16rtomb
e c32rtomb
existiam para traduzir entre cadeias de caracteres estreitas UTF-8, UTF-16 (mesma codificação que wchar_t
em plataformas Windows) e UTF-32. Por motivos de compatibilidade, essas APIs ainda são convertidas apenas de e para UTF-8 e não para a página de código definida via setlocale
.
Para usar esse recurso em um sistema operacional anterior ao Windows 10, você deve utilizar a implantação local do aplicativo ou o link estaticamente usando a versão 1803 (10.0.17134.0) do SDK do Windows ou posteriores. Para sistemas operacionais do Windows 10 anteriores à versão 1803 (10.0.17134.0), há suporte apenas para a vinculação estática.
Requisitos
Rotina | Cabeçalho necessário |
---|---|
setlocale |
<locale.h> |
_wsetlocale |
<locale.h> ou <wchar.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// crt_setlocale.c
//
// This program demonstrates the use of setlocale when
// using two independent threads.
//
#include <locale.h>
#include <process.h>
#include <windows.h>
#include <stdio.h>
#include <time.h>
#define BUFF_SIZE 100
// Retrieve the date in the current
// locale's format.
int get_date(unsigned char* str)
{
__time64_t ltime;
struct tm thetime;
// Retrieve the current time
_time64(<ime);
_gmtime64_s(&thetime, <ime);
// Format the current time structure into a string
// "%#x" is the long date representation in the
// current locale
if (!strftime((char *)str, BUFF_SIZE, "%#x",
(const struct tm *)&thetime))
{
printf("strftime failed!\n");
return -1;
}
return 0;
}
// This thread sets its locale to the argument and prints the date.
unsigned __stdcall SecondThreadFunc(void* pArguments)
{
unsigned char str[BUFF_SIZE];
char * locale = (char *)pArguments;
// Set the thread locale
printf("The thread locale is now set to %s.\n",
setlocale(LC_ALL, locale));
// Retrieve the date string from the helper function
if (get_date(str) == 0)
{
printf("The date in %s locale is: '%s'\n", locale, str);
}
_endthreadex( 0 );
return 0;
}
// The main thread sets the locale to English
// and then spawns a second thread (above) and prints the date.
int main()
{
HANDLE hThread;
unsigned threadID;
unsigned char str[BUFF_SIZE];
// Enable per-thread locale causes all subsequent locale
// setting changes in this thread to only affect this thread.
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
// Set the locale of the main thread to US English.
printf("The thread locale is now set to %s.\n",
setlocale(LC_ALL, "en-US"));
// Create the second thread with a German locale.
// Our thread function takes an argument of the locale to use.
hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc,
(void*)"de-DE", 0, &threadID );
if (get_date(str) == 0)
{
// Retrieve the date string from the helper function
printf("The date in en-US locale is: '%s'\n\n", str);
}
// Wait for the created thread to finish.
WaitForSingleObject( hThread, INFINITE );
// Destroy the thread object.
CloseHandle( hThread );
}
The thread locale is now set to en-US.
The date in en-US locale is: 'Thursday, January 4, 2024'
The thread locale is now set to de-DE.
The date in de-DE locale is: 'Donnerstag, 4. Januar 2024'
Confira também
Nomes de localidade, idiomas e cadeias de caracteres de país/região
_configthreadlocale
_create_locale
, _wcreate_locale
Localidade
localeconv
_mbclen
, mblen
, _mblen_l
strlen
, wcslen
, _mbslen
, _mbslen_l
, _mbstrlen
, , _mbstrlen_l
mbstowcs
, _mbstowcs_l
mbtowc
, _mbtowc_l
_setmbcp
Funções strcoll
strftime
, wcsftime
, _strftime_l
, _wcsftime_l
strxfrm
, wcsxfrm
, _strxfrm_l
, _wcsxfrm_l
wcstombs
, _wcstombs_l
wctomb
, _wctomb_l