Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ustaw lub pobierz ustawienia regionalne czasu wykonywania.
Składnia
char *setlocale(
int category,
const char *locale
);
wchar_t *_wsetlocale(
int category,
const wchar_t *locale
);
Parametry
category
Kategoria, której dotyczą ustawienia regionalne.
locale
Specyfikator ustawień regionalnych.
Wartość zwracana
Jeśli wartość jest prawidłowa locale
i category
jest podana, funkcje zwracają wskaźnik do ciągu skojarzonego z określonymi locale
wartościami i category
.
locale
Jeśli argument to NULL
, funkcje zwracają bieżące ustawienia regionalne.
Jeśli do jednej z funkcji zostanie przekazany nieprawidłowy argument, zwracana wartość to NULL
.
Zachowanie nieprawidłowych argumentów jest następujące:
Function | Nieprawidłowy parametr | Nieprawidłowa procedura obsługi wywołana zgodnie z opisem w temacie Weryfikacja parametrów | Ustawia errno |
---|---|---|---|
setlocale |
category |
tak | tak |
setlocale |
locale |
nie | nie |
_wsetlocale |
category |
tak | tak |
_wsetlocale |
locale |
nie | nie |
Wywołanie:
setlocale( LC_ALL, "en-US" );
ustawia wszystkie kategorie, zwracając tylko ciąg
en-US
Możesz skopiować ciąg zwrócony przez setlocale
program, aby przywrócić te części informacji o ustawieniach regionalnych programu. Magazyn lokalny globalny lub wątkowy jest używany dla ciągu zwracanego przez setlocale
. Później wywołuje metodę zastępowania setlocale
ciągu, która unieważnia wskaźniki ciągu zwracane przez wcześniejsze wywołania.
Uwagi
setlocale
Użyj funkcji , aby ustawić, zmienić lub wysłać zapytanie dotyczące niektórych lub wszystkich bieżących ustawień regionalnych programu określonych przez locale
i category
. locale
odnosi się do lokalizacji (kraj/region i język), dla których można dostosować niektóre aspekty programu. Niektóre kategorie zależne od ustawień regionalnych obejmują formatowanie dat i format wyświetlania wartości pieniężnych. Jeśli ustawisz locale
domyślny ciąg dla języka, który ma wiele formularzy obsługiwanych na komputerze, sprawdź wartość zwracaną setlocale
, aby zobaczyć, który język jest w mocy. Jeśli na przykład ustawiono locale
"chinese"
wartość zwracaną, może to być "chinese-simplified"
wartość lub "chinese-traditional"
.
_wsetlocale
jest wersją szerokoznakową ; setlocale
locale
argument i wartość zwracana _wsetlocale
są ciągami o szerokim znaku. _wsetlocale
i setlocale
zachowywać się identycznie inaczej.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Mapowania procedur tekstu ogólnego
TCHAR.H rutyna |
_UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowany |
_UNICODE zdefiniowany |
---|---|---|---|
_tsetlocale |
setlocale |
setlocale |
_wsetlocale |
Argument category
określa części informacji o ustawieniach regionalnych programu, których dotyczy problem. Makra używane w programie category
i jego części są następujące:
category flaga |
Wpływa |
---|---|
LC_ALL |
Wszystkie kategorie, jak wymieniono poniżej. |
LC_COLLATE |
Funkcje strcoll , , wcscoll _strncoll _wcsicoll _stricoll _strnicoll _wcsncoll strxfrm , _wcsnicoll , i .wcsxfrm |
LC_CTYPE |
Funkcje obsługi znaków (z wyjątkiem isdigit , isxdigit , mbstowcs i mbtowc , które nie mają wpływu). |
LC_MONETARY |
Informacje o formatowaniu pieniężnym zwracane przez localeconv funkcję . |
LC_NUMERIC |
Znak dziesiętny dla sformatowanych procedur wyjściowych (takich jak printf ), dla procedur konwersji danych i dla informacji formatowania niemonetary zwracanych przez localeconv . Oprócz znaku LC_NUMERIC separatora dziesiętnego ustawia separator tysięcy i ciąg kontrolny grupowania zwracany przez localeconv . |
LC_TIME |
Funkcje strftime i wcsftime . |
Ta funkcja sprawdza poprawność parametru kategorii. Jeśli parametr kategorii nie jest jedną z wartości podanych w poprzedniej tabeli, wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonywanie jest dozwolone do kontynuowania, funkcja ustawia wartość errno
EINVAL
i zwraca wartość NULL
.
Argument locale
jest wskaźnikiem do ciągu, który określa ustawienia regionalne. Aby uzyskać informacje o formacie argumentu locale
, zobacz Nazwy ustawień regionalnych, Języki i Ciągi kraju/regionu. Jeśli locale
wskazuje pusty ciąg, ustawienia regionalne są środowiskiem natywnym zdefiniowanym przez implementację. Wartość parametru C
określa minimalne środowisko zgodne ze standardem ANSI na potrzeby tłumaczenia języka C. Ustawienia C
regionalne zakładają, że wszystkie char
typy danych to 1 bajt i że ich wartość jest zawsze mniejsza niż 256.
W momencie uruchamiania programu wykonywany jest odpowiednik następującej instrukcji:
setlocale( LC_ALL, "C" );
Argument locale
może przyjmować nazwę ustawień regionalnych, ciąg języka, ciąg języka i kod kraju/regionu, stronę kodową lub ciąg języka, kod kraju/regionu i stronę kodową. Dostępne nazwy ustawień regionalnych, języki, kody kraju/regionu i strony kodu obejmują wszystkie te obsługiwane przez interfejs API równoważenia obciążenia sieciowego systemu Windows. Zestaw nazw ustawień regionalnych obsługiwanych przez setlocale
program jest opisany w temacie Nazwy ustawień regionalnych, Języki i Ciągi kraju/regionu. Zestaw ciągów języka i kraju/regionu obsługiwanych przez setlocale
program jest wymieniony w ciągach języka i ciągach kraju/regionu. Firma Microsoft zaleca formę nazwy ustawień regionalnych ze względu na wydajność i łatwość konserwacji ciągów ustawień regionalnych, osadzonych w kodzie lub szeregowanych do pamięci. Zmiana ciągów nazw ustawień regionalnych przez aktualizację systemu operacyjnego jest mniej prawdopodobna niż zmiana formy nazwy języka i kraju/regionu.
Wskaźnik o wartości null, który jest przekazywany, gdy locale
argument informuje setlocale
o zapytaniu zamiast ustawiać środowisko międzynarodowe. locale
Jeśli argument jest wskaźnikiem o wartości null, bieżące ustawienie ustawień regionalnych programu nie zostanie zmienione. setlocale
Zamiast tego zwraca wskaźnik do ciągu skojarzonego z category
bieżącymi ustawieniami regionalnymi wątku. category
Jeśli argument to LC_ALL
, funkcja zwraca ciąg wskazujący bieżące ustawienie każdej kategorii rozdzielone średnikami. Na przykład, sekwencja wywołań
// 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));
zwraca
LC_COLLATE=en-US;LC_CTYPE=en-US;LC_MONETARY=fr-FR;LC_NUMERIC=en-US;LC_TIME=en-US
to ciąg skojarzony z kategorią LC_ALL
.
Poniższe przykłady odnoszą się do LC_ALL
kategorii. Jeden z ciągów ". OCP" i ". Acp" można użyć zamiast numeru strony kodowej, aby określić użycie domyślnej strony kodowej OEM użytkownika i domyślnej strony kodowej ANSI użytkownika odpowiednio dla tej nazwy ustawień regionalnych.
setlocale( LC_ALL, "" );
Ustawia ustawienia regionalne na domyślne, czyli domyślną stronę kodową ANSI użytkownika, uzyskaną z systemu operacyjnego. Nazwa ustawień regionalnych jest ustawiona na wartość zwracaną przez
GetUserDefaultLocaleName
. Strona kodowa jest ustawiona na wartość zwracaną przezGetACP
.setlocale( LC_ALL, ".OCP" );
Ustawia ustawienia regionalne na bieżącą stronę kodu producenta OEM uzyskaną z systemu operacyjnego. Nazwa ustawień regionalnych jest ustawiona na wartość zwracaną przez
GetUserDefaultLocaleName
. Strona kodowa jest ustawionaLOCALE_IDEFAULTCODEPAGE
na wartość domyślnej nazwy ustawień regionalnych użytkownika przezGetLocaleInfoEx
.setlocale( LC_ALL, ".ACP" );
Ustawia ustawienia regionalne na bieżącą stronę kodową ANSI, uzyskaną od systemu operacyjnego. Nazwa ustawień regionalnych jest ustawiona na wartość zwracaną przez
GetUserDefaultLocaleName
. Strona kodowa jest ustawionaLOCALE_IDEFAULTANSICODEPAGE
na wartość domyślnej nazwy ustawień regionalnych użytkownika przezGetLocaleInfoEx
.setlocale( LC_ALL, "<localename>" );
Ustawia ustawienia regionalne na nazwę ustawień regionalnych, która jest wskazywana przez
<localename>
. Strona kodowa jest ustawionaLOCALE_IDEFAULTANSICODEPAGE
na wartość określonej nazwy ustawień regionalnych według .GetLocaleInfoEx
setlocale( LC_ALL, "<language>_<country>" );
Ustawia ustawienia regionalne na język i kraj/region wskazany przez
<language>
i<country>
, wraz z domyślną stroną kodów uzyskaną z systemu operacyjnego hosta. Strona kodowa jest ustawionaLOCALE_IDEFAULTANSICODEPAGE
na wartość określonej nazwy ustawień regionalnych według .GetLocaleInfoEx
setlocale( LC_ALL, "<language>_<country>.<code_page>" );
Ustawia ustawienia regionalne na język, kraj/region i stronę kodową wskazywaną
<language>
przez ciągi ,<country>
i<code_page>
. Można użyć różnych kombinacji języka, kraju/regionu i strony kodowej. Na przykład, to wywołanie ustawia ustawienia regionalne na francuski-Kanada ze stroną kodową 1252:setlocale( LC_ALL, "French_Canada.1252" );
To wywołanie ustawia ustawienia regionalne na francuski-Kanada z domyślną stroną kodową ANSI:
setlocale( LC_ALL, "French_Canada.ACP" );
To wywołanie ustawia ustawienia regionalne na francuski-Kanada z domyślną stroną kodową OEM:
setlocale( LC_ALL, "French_Canada.OCP" );
setlocale( LC_ALL, "<language>" );
Ustawia ustawienia regionalne na język wskazany przez
<language>
, i używa domyślnego kraju/regionu dla określonego języka oraz domyślnej strony kodowej ANSI użytkownika dla tego kraju/regionu uzyskanego z systemu operacyjnego hosta. Na przykład następujące wywołania sąsetlocale
funkcjonalnie równoważne:setlocale( LC_ALL, "en-US" );
setlocale( LC_ALL, "English" );
setlocale( LC_ALL, "English_United States.1252" );
Zaleca się pierwszą formę ze względu na wydajność oraz łatwość konserwacji.
setlocale( LC_ALL, ".<code_page>" );
Ustawia stronę kodu na wartość wskazaną przez
<code_page>
, wraz z domyślnym krajem/regionem i językiem (zdefiniowanym przez system operacyjny hosta) dla określonej strony kodowej.
Kategoria musi mieć LC_ALL
wartość lub LC_CTYPE
w celu wprowadzenia zmiany strony kodowej. Jeśli na przykład domyślny kraj/region i język systemu operacyjnego hosta to "United States
" i "English
", następujące dwa wywołania setlocale
są funkcjonalnie równoważne:
setlocale( LC_ALL, ".1252" );
setlocale( LC_ALL, "English_United States.1252");
Aby uzyskać więcej informacji, zobacz dyrektywę setlocale
pragma w dokumentacji preprocesora języka C/C++.
Funkcja _configthreadlocale
służy do kontrolowania, czy setlocale
wpływa na ustawienia regionalne wszystkich wątków w programie, czy tylko ustawienia regionalne wątku wywołującego.
Obsługa protokołu UTF-8
Począwszy od systemu Windows 10 w wersji 1803 (10.0.17134.0), środowisko uruchomieniowe uniwersalnego języka C obsługuje korzystanie ze strony kodowej UTF-8. Zmiana oznacza, że char
ciągi przekazywane do funkcji środowiska uruchomieniowego języka C mogą oczekiwać ciągów w kodowaniu UTF-8. Aby włączyć tryb UTF-8, użyj jako ".UTF8"
strony kodowej w przypadku korzystania z polecenia setlocale
. Na przykład setlocale(LC_ALL, ".UTF8")
używa bieżącej domyślnej strony kodowej systemu Windows ANSI (ACP) dla ustawień regionalnych i UTF-8 dla strony kodowej.
Ciąg określający tryb UTF-8 to:
- bez uwzględniania wielkości liter
- łącznik (
-
) jest opcjonalny - Musi ona znajdować się w części strony kodowej nazwy ustawień regionalnych, więc musi mieć kropkę wiodącą (
.
), jak w następujących przykładach:"en_US.UTF8"
lub".utf8"
W poniższych przykładach pokazano, jak określić ciąg UTF-8:
".UTF8"
".UTF-8"
".utf8"
".utf-8"
"en_us.utf8"
"ja_JP.Utf-8"
Po wywołaniu setlocale(LC_ALL, ".UTF8")
metody można przekazać element "😊" do mbtowcs
elementu i zostanie on prawidłowo przetłumaczony na wchar_t
ciąg. Wcześniej nie było dostępne ustawienie ustawień regionalnych do wykonania tego tłumaczenia.
Tryb UTF-8 jest również włączony dla funkcji, które mają historycznie przetłumaczone char
ciągi przy użyciu domyślnej strony kodowej SYSTEMU Windows ANSI (ACP). Na przykład wywołanie _mkdir("😊")
podczas korzystania ze strony kodowej UTF-8 spowoduje poprawne utworzenie katalogu z tym emoji jako nazwy folderu, zamiast wymagać zmiany elementu ACP na UTF-8 przed uruchomieniem programu. Podobnie wywołanie _getcwd()
w tym folderze zwraca zakodowany ciąg UTF-8. W celu zapewnienia zgodności urządzenie ACP jest nadal używane, jeśli strona kodowa języka C nie jest ustawiona na wartość UTF-8.
Następujące aspekty środowiska uruchomieniowego języka C nie mogą używać protokołu UTF-8, ponieważ są one ustawiane podczas uruchamiania programu i muszą używać domyślnej strony kodowej systemu Windows ANSI (ACP): __argv
, _acmdln
i _pgmptr
.
Wcześniej ta obsługa, mbrtoc16
, , c16rtomb
mbrtoc32
i c32rtomb
istniała do tłumaczenia między wąskimi ciągami UTF-8, UTF-16 (takie samo kodowanie jak wchar_t
na platformach Windows) i UTF-32. Ze względów zgodności te interfejsy API nadal tłumaczą się tylko na protokół UTF-8, a nie na stronę kodową ustawioną za pomocą polecenia setlocale
.
Aby użyć tej funkcji w systemie operacyjnym przed systemem Windows 10, należy użyć wdrożenia lokalnego aplikacji lub linku statycznie przy użyciu wersji 1803 (10.0.17134.0) zestawu Windows SDK lub nowszej wersji. W przypadku systemów operacyjnych Windows 10 wcześniejszych niż 1803 (10.0.17134.0) obsługiwane jest tylko łączenie statyczne.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
setlocale |
<locale.h> |
_wsetlocale |
<locale.h> lub <wchar.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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'
Zobacz też
Nazwy ustawień regionalnych, języki i ciągi kraj/region
_configthreadlocale
_create_locale
, _wcreate_locale
ustawienia regionalne
localeconv
_mbclen
, , mblen
_mblen_l
strlen
, , wcslen
, _mbslen
, _mbslen_l
, , _mbstrlen
_mbstrlen_l
mbstowcs
, _mbstowcs_l
mbtowc
, _mbtowc_l
_setmbcp
strcoll
, funkcje
strftime
, , wcsftime
, , _strftime_l
_wcsftime_l
strxfrm
, , wcsxfrm
, , _strxfrm_l
_wcsxfrm_l
wcstombs
, _wcstombs_l
wctomb
, _wctomb_l