Aracılığıyla paylaş


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 categoryile 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 setlocaledö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 categorytarafı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 setlocalegeniş 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, _wcsnicollve wcsxfrm işlevleri.
LC_CTYPE Karakter işleme işlevleri (etkilenmeyen , isxdigit, mbstowcsve mbtowcdışı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 localeconvdö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 localeconvdö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 GetUserDefaultLocaleNamedöndürülen değere ayarlanır. Kod sayfası tarafından GetACPdö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 GetUserDefaultLocaleNamedöndürülen değere ayarlanır. Kod sayfası, kullanıcı tarafından varsayılan yerel ayar adı değeri olarak GetLocaleInfoExayarlanı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 GetUserDefaultLocaleNamedöndürülen değere ayarlanır. Kod sayfası, kullanıcı tarafından varsayılan yerel ayar adı değeri olarak GetLocaleInfoExayarlanırLOCALE_IDEFAULTANSICODEPAGE.

  • setlocale( LC_ALL, "<localename>" );

    Yerel ayarı ile <localename>belirtilen yerel ayar adına ayarlar. Kod sayfası, tarafından GetLocaleInfoExbelirtilen 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ından GetLocaleInfoExbelirtilen 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ılar setlocale 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, _acmdlnve _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(&ltime);
    _gmtime64_s(&thetime, &ltime);

    // 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