setlocale
, _wsetlocale
Çalışma zamanı yerel ayarını ayarlayın veya alın.
Sözdizimi
char *setlocale(
int category,
const char *locale
);
wchar_t *_wsetlocale(
int category,
const wchar_t *locale
);
Parametreler
category
Yerel ayardan etkilenen kategori.
locale
Yerel ayar tanımlayıcı.
Dönüş değeri
Geçerli locale
bir ve category
verilirse, işlevler belirtilen locale
ve category
ile ilişkilendirilmiş dizeye bir işaretçi döndürür.
locale
Bağımsız değişken iseNULL
, işlevler geçerli yerel ayarı döndürür.
İki işlevden herhangi biri için geçersiz bir bağımsız değişken geçirilirse, dönüş değeri olur NULL
.
Geçersiz bağımsız değişkenlerin davranışı aşağıdaki gibidir:
İşlev | Geçersiz parametre | Parametre doğrulamasında açıklandığı gibi geçersiz işleyici çağrıldı | Ayarlar errno |
---|---|---|---|
setlocale |
category |
evet | evet |
setlocale |
locale |
hayır | hayır |
_wsetlocale |
category |
evet | evet |
_wsetlocale |
locale |
hayır | hayır |
Çağrı:
setlocale( LC_ALL, "en-US" );
yalnızca dizeyi döndürür ve tüm kategorileri ayarlar
en-US
Programın yerel ayar bilgilerinin bu bölümünü geri yüklemek için tarafından setlocale
döndürülen dizeyi kopyalayabilirsiniz. Tarafından setlocale
döndürülen dize için genel veya iş parçacığı yerel depolaması kullanılır. Daha sonra dizenin üzerine yazmaya yönelik çağrılar setlocale
, önceki çağrılar tarafından döndürülen dize işaretçilerini geçersiz kıldığı için.
Açıklamalar
setlocale
ve category
tarafından locale
belirtilen geçerli program yerel ayarı bilgilerini ayarlamak, değiştirmek veya sorgulamak için işlevini kullanın. locale
, programınızın belirli yönlerini özelleştirebileceğiniz yerelliği (ülke/bölge ve dil) ifade eder. Bazı yerel ayara bağımlı kategoriler tarih biçimlendirmesini ve parasal değerlerin görüntülenme biçimini içerir. Bilgisayarınızda birden çok formun desteklendiği bir dilin varsayılan dizesini ayarlarsanız locale
, hangi dilin setlocale
etkin olduğunu görmek için dönüş değerini denetlemeniz gerekir. Örneğin, dönüş değerini olarak ayarlarsanız locale
"chinese"
veya "chinese-traditional"
olabilir"chinese-simplified"
.
_wsetlocale
, öğesinin setlocale
geniş karakterli bir sürümüdür; locale
bağımsız değişkeni ve dönüş değeri _wsetlocale
geniş karakterli dizelerdir. _wsetlocale
ve setlocale
aksi takdirde aynı şekilde davran.
Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bu davranışı değiştirmek için bkz. CRT'de Genel durum.
Genel metin yordamı eşlemeleri
TCHAR.H olağan |
_UNICODE ve _MBCS tanımlanmadı |
_MBCS tanımlanan |
_UNICODE tanımlanan |
---|---|---|---|
_tsetlocale |
setlocale |
setlocale |
_wsetlocale |
bağımsız değişkeni, category
bir programın yerel ayar bilgilerinin etkilenen bölümlerini belirtir. için category
kullanılan makrolar ve programın etkilediği bölümler şunlardır:
category bayrak |
Etkiledi -ğini |
---|---|
LC_ALL |
Aşağıda listelendiği gibi tüm kategoriler. |
LC_COLLATE |
strcoll , , _stricoll , wcscoll , _wcsicoll , , strxfrm , _strncoll , _strnicoll , _wcsncoll , _wcsnicoll ve wcsxfrm işlevleri. |
LC_CTYPE |
Karakter işleme işlevleri (etkilenmeyen , isxdigit , mbstowcs ve mbtowc dışındaisdigit ). |
LC_MONETARY |
İşlev tarafından localeconv döndürülen parasal biçimlendirme bilgileri. |
LC_NUMERIC |
Veri dönüştürme yordamları ve tarafından localeconv döndürülen sanal olmayan biçimlendirme bilgileri için biçimlendirilmiş çıkış yordamları (örneğinprintf ) için ondalık nokta karakteri. Ondalık nokta karakterine ek olarak, LC_NUMERIC binlik ayırıcısını ve tarafından localeconv döndürülen gruplandırma denetim dizesini ayarlar. |
LC_TIME |
strftime ve wcsftime işlevleri. |
Bu işlev, kategori parametresini doğrular. Kategori parametresi önceki tabloda verilen değerlerden biri değilse, Parametre doğrulama bölümünde açıklandığı gibi geçersiz parametre işleyicisi çağrılır. Yürütmenin devam etmesi için izin verilirse, işlevi olarak EINVAL
ayarlanır errno
ve döndürürNULL
.
locale
Bağımsız değişken, yerel ayarı belirten bir dize işaretçisidir. Bağımsız değişkenin locale
biçimi hakkında bilgi için bkz . Yerel ayar adları, Diller ve Ülke/Bölge dizeleri. Boş bir dizeye işaret ederse locale
, yerel ayar uygulama tanımlı yerel ortamdır. değeri C
, C çevirisi için en düşük ANSI uyumlu ortamı belirtir. Yerel ayar, C
tüm char
veri türlerinin 1 bayt olduğunu ve değerlerinin her zaman 256'dan küçük olduğunu varsayar.
Program açılışında, aşağıdaki ifadenin eşdeğeri çalıştırılır:
setlocale( LC_ALL, "C" );
Bağımsız locale
değişken bir yerel ayar adı, dil dizesi, dil dizesi ve ülke/bölge kodu, kod sayfası veya dil dizesi, ülke/bölge kodu ve kod sayfası alabilir. Kullanılabilir yerel ayar adları, diller, ülke/bölge kodları ve kod sayfaları, Windows NLS API'sinin desteklediği tüm yerel ayarları içerir. tarafından setlocale
desteklenen yerel ayar adları kümesi Yerel ayar adları, Diller ve Ülke/Bölge dizelerinde açıklanmıştır. Tarafından desteklenen setlocale
dil ve ülke/bölge dizeleri kümesi, Dil dizeleri ve Ülke/Bölge dizelerinde listelenir. Kod içinde gömülü veya depolama için seri hale getirilmiş yerel ayar dizelerinin devamlılığı ve performansı için yerel ayar adı biçimi öneririz. Yerel ayar adı dizelerinin bir işletim sistemi güncelleştirmesi tarafından değiştirilmesi olasılığı dil ve ülke/bölge adı biçiminin değiştirilmesi olasılığından daha düşüktür.
Bağımsız değişken uluslararası ortamı ayarlamak yerine sorgulamayı söylerken locale
setlocale
geçirilen null işaretçi. locale
Bağımsız değişken null işaretçiyse, programın geçerli yerel ayarı değiştirilmez. Bunun yerine, setlocale
iş parçacığının geçerli yerel ayarıyla ilişkili dizeye category
bir işaretçi döndürür. category
Bağımsız değişken iseLC_ALL
, işlev her kategorinin geçerli ayarını noktalı virgülle ayırarak gösteren bir dize döndürür. Örneğin, çağrı
// 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));
dizisi
LC_COLLATE=en-US;LC_CTYPE=en-US;LC_MONETARY=fr-FR;LC_NUMERIC=en-US;LC_TIME=en-US
bu, kategoriyle LC_ALL
ilişkili dizedir.
Aşağıdaki örnekler kategoriyle ilgili.LC_ALL
dizelerinden biri ". OCP" ve ". ACP", sırasıyla bu yerel ayar adı için kullanıcı varsayılan OEM kod sayfasının ve kullanıcı varsayılan ANSI kod sayfasının kullanımını belirtmek için kod sayfası numarası yerine kullanılabilir.
setlocale( LC_ALL, "" );
Yerel ayarı, işletim sisteminden alınan kullanıcının varsayılan ANSI kod sayfası olan varsayılana ayarlar. Yerel ayar adı tarafından
GetUserDefaultLocaleName
döndürülen değere ayarlanır. Kod sayfası tarafındanGetACP
döndürülen değere ayarlanır.setlocale( LC_ALL, ".OCP" );
Yerel ayarı işletim sisteminden alınan geçerli OEM kod sayfasına ayarlar. Yerel ayar adı tarafından
GetUserDefaultLocaleName
döndürülen değere ayarlanır. Kod sayfası, kullanıcı tarafından varsayılan yerel ayar adı değeri olarakGetLocaleInfoEx
ayarlanırLOCALE_IDEFAULTCODEPAGE
.setlocale( LC_ALL, ".ACP" );
Yerel ayarı işletim sisteminden alınan geçerli ANSI kod sayfasına ayarlar. Yerel ayar adı tarafından
GetUserDefaultLocaleName
döndürülen değere ayarlanır. Kod sayfası, kullanıcı tarafından varsayılan yerel ayar adı değeri olarakGetLocaleInfoEx
ayarlanırLOCALE_IDEFAULTANSICODEPAGE
.setlocale( LC_ALL, "<localename>" );
Yerel ayarı ile
<localename>
belirtilen yerel ayar adına ayarlar. Kod sayfası, tarafındanGetLocaleInfoEx
belirtilen yerel ayar adının değerine ayarlanırLOCALE_IDEFAULTANSICODEPAGE
.setlocale( LC_ALL, "<language>_<country>" );
Yerel ayarı ve
<country>
tarafından<language>
belirtilen dile ve ülkeye/bölgeye, konak işletim sisteminden alınan varsayılan kod sayfasıyla birlikte ayarlar. Kod sayfası, tarafındanGetLocaleInfoEx
belirtilen yerel ayar adının değerine ayarlanırLOCALE_IDEFAULTANSICODEPAGE
.setlocale( LC_ALL, "<language>_<country>.<code_page>" );
Yerel ayarı, ,
<country>
ve dizeleriyle belirtilen<language>
dil, ülke/bölge ve<code_page>
kod sayfasına ayarlar. Dilin, ülkenin/bölgenin ve kod sayfasının çeşitli birleşimlerini kullanabilirsiniz. Örneğin, bu çağrı yerel ayarı kod sayfası 1252 ile Fransızca Kanada olarak ayarlar:setlocale( LC_ALL, "French_Canada.1252" );
Bu çağrı yerel ayarı varsayılan ANSI kod sayfasıyla Fransızca Kanada olarak ayarlar:
setlocale( LC_ALL, "French_Canada.ACP" );
Bu çağrı yerel ayarı varsayılan OEM kod sayfasıyla Fransızca Kanada olarak ayarlar:
setlocale( LC_ALL, "French_Canada.OCP" );
setlocale( LC_ALL, "<language>" );
Yerel ayarı tarafından
<language>
belirtilen dile ayarlar ve ana bilgisayar işletim sisteminden elde edilen belirtilen dil için varsayılan ülke/bölge ve bu ülke/bölge için kullanıcı varsayılan ANSI kod sayfasını kullanır. Örneğin, için aşağıdaki çağrılarsetlocale
işlevsel olarak eşdeğerdir:setlocale( LC_ALL, "en-US" );
setlocale( LC_ALL, "English" );
setlocale( LC_ALL, "English_United States.1252" );
Performans ve bakım için ilk biçimi öneririz.
setlocale( LC_ALL, ".<code_page>" );
Kod sayfasını, belirtilen kod sayfası için varsayılan ülke/bölge ve dil (konak işletim sistemi tarafından tanımlandığı gibi) ile belirtilen değere
<code_page>
ayarlar.
Kod sayfasındaki bir değişikliğin geçerli olması için kategorinin ya da LC_ALL
LC_CTYPE
olması gerekir. Örneğin, konak işletim sisteminin varsayılan ülke/bölge ve dili "United States
" ve "English
" ise, aşağıdaki iki çağrı setlocale
işlevsel olarak eşdeğerdir:
setlocale( LC_ALL, ".1252" );
setlocale( LC_ALL, "English_United States.1252");
Daha fazla bilgi için C/C++ Önişlemci Başvurusu'ndaki pragma yönergesine bakınsetlocale
.
işlevi _configthreadlocale
, bir programdaki tüm iş parçacıklarının yerel ayarını mı yoksa çağıran iş parçacığının yalnızca yerel ayarını mı setlocale
etkileyeceğini denetlemek için kullanılır.
UTF-8 desteği
Windows 10 sürüm 1803 'den (10.0.17134.0) başlayarak, Universal C Çalışma Zamanı UTF-8 kod sayfası kullanmayı destekler. Değişiklik, C çalışma zamanı işlevlerine geçirilen dizelerin UTF-8 kodlamasında dizeler bekleyebilecekleri anlamına gelir char
. UTF-8 modunu etkinleştirmek için kullanırken kod sayfası olarak kullanın ".UTF8"
setlocale
. Örneğin, setlocale(LC_ALL, ".UTF8")
yerel ayar için geçerli varsayılan Windows ANSI kod sayfasını (ACP) ve kod sayfası için UTF-8'i kullanır.
UTF-8 modunu belirtmek için dize:
- büyük/küçük harfe duyarlı değil
- kısa çizgi (
-
) isteğe bağlıdır - Yerel ayar adının kod sayfasında yer almalıdır, bu nedenle şu örneklerde olduğu gibi bir baştaki nokta (
.
) olmalıdır:"en_US.UTF8"
veya".utf8"
Aşağıdaki örneklerde UTF-8 dizesinin nasıl belirtileceğini gösterilmektedir:
".UTF8"
".UTF-8"
".utf8"
".utf-8"
"en_us.utf8"
"ja_JP.Utf-8"
çağrısı setlocale(LC_ALL, ".UTF8")
yaptıktan sonra ,"😊" öğesini öğesine mbtowcs
geçirebilirsiniz ve düzgün bir şekilde bir wchar_t
dizeye çevrilir. Daha önce, bu çeviriyi yapmak için kullanılabilir bir yerel ayar yoktu.
UTF-8 modu, varsayılan Windows ANSI kod sayfası (ACP) kullanılarak geçmişe çevrilmiş char
dizelere sahip işlevler için de etkinleştirilir. Örneğin, UTF-8 kod sayfası kullanılırken çağrılması _mkdir("😊")
, programınızı çalıştırmadan önce ACP'nin UTF-8 olarak değiştirilmesini gerektirmek yerine klasör adı olarak bu emojiye sahip bir dizini doğru bir şekilde oluşturur. Benzer şekilde, bu klasörde çağrılması _getcwd()
utf-8 kodlanmış bir dize döndürür. Uyumluluk için C yerel ayar kodu sayfası UTF-8 olarak ayarlı değilse ACP hala kullanılır.
C Çalışma Zamanı'nın aşağıdaki yönleri, program başlatma sırasında ayarlandığından ve varsayılan Windows ANSI kod sayfasını (ACP) kullanması gerektiğinden UTF-8'i kullanamaz: __argv
, _acmdln
ve _pgmptr
.
Bu destek, mbrtoc16
,mbrtoc32
,c16rtomb
ve c32rtomb
desteklerinden önce UTF-8 dar dizeleri, UTF-16 (Windows platformlarında olduğu gibi wchar_t
kodlama) ve UTF-32 arasında çeviri yapmak için mevcut. Uyumluluk nedeniyle, bu API'ler aracılığıyla ayarlanan kod sayfasına değil, yalnızca UTF-8'e ve utf-8'e çevrilir setlocale
.
Bu özelliği Windows 10 öncesi bir işletim sisteminde kullanmak için uygulama yerel dağıtımını kullanmanız veya Windows SDK'sının 1803 (10.0.17134.0) sürümünü kullanarak statik olarak bağlantı oluşturmanız gerekir. 1803'e (10.0.17134.0) önceki Windows 10 işletim sistemleri için yalnızca statik bağlama desteklenir.
Gereksinimler
Yordam | Gerekli başlık |
---|---|
setlocale |
<locale.h> |
_wsetlocale |
<locale.h> veya <wchar.h> |
Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.
Örnek
// 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'
Ayrıca bkz.
Yerel ayar adları, Diller ve Ülke/Bölge dizeleri
_configthreadlocale
_create_locale
, _wcreate_locale
Yerel ayar
localeconv
_mbclen
, mblen
, _mblen_l
strlen
, wcslen
, _mbslen
, , _mbslen_l
, _mbstrlen
, _mbstrlen_l
mbstowcs
, _mbstowcs_l
mbtowc
, _mbtowc_l
_setmbcp
strcoll
işlevleri
strftime
, wcsftime
, _strftime_l
, _wcsftime_l
strxfrm
, wcsxfrm
, _strxfrm_l
, _wcsxfrm_l
wcstombs
, _wcstombs_l
wctomb
, _wctomb_l