Aracılığıyla paylaş


mbrtowc

Geçerli yerel ayardaki çok baytlı bir karakteri, çok baytlı bir karakterin ortasında yeniden başlatma özelliğiyle eşdeğer geniş karaktere dönüştürün.

Sözdizimi

size_t mbrtowc(
   wchar_t *wchar,
   const char *mbchar,
   size_t count,
   mbstate_t *mbstate
);

Parametreler

wchar
Dönüştürülen geniş karakter dizesini (tür wchar_t) almak için geniş bir karakterin adresi. Dönüş geniş karakteri gerekli değilse, bu değer null işaretçi olabilir.

mbchar
Bayt dizisinin adresi (çok baytlı karakter).

count
Denetlenecek bayt sayısı.

mbstate
Dönüştürme durumu nesnesi işaretçisi. Bu değer null bir işaretçiyse, işlev statik bir iç dönüştürme durumu nesnesi kullanır. İç mbstate_t nesne iş parçacığı açısından güvenli olmadığından, her zaman kendi mbstate bağımsız değişkeninizi geçirmenizi öneririz.

Dönüş değeri

Aşağıdaki değerlerden biri:

0 Sonraki count veya daha az bayt, null işaretçisi değilse wchar içinde wchardepolanan null geniş karakteri temsil eden çok baytlı karakteri tamamlar.

1 - count, dahil Sonraki count veya daha az bayt geçerli bir çok baytlı karakteri tamamlar. Döndürülen değer, çok baytlı karakteri tamamlayan bayt sayısıdır. Geniş karakter eşdeğeri, null işaretçi değilse wchar içinde wchardepolanır.

(size_t) (-1) Kodlama hatası oluştu. Sonraki count veya daha az bayt, tam ve geçerli bir çok baytlı karaktere katkıda bulunmaz. Bu durumda, errno EILSEQ olarak ayarlanır ve içindeki mbstate dönüştürme kaydırma durumu belirtilmez.

(size_t) (-2) Sonraki count baytlar eksik ancak geçerli olabilecek çok baytlı bir karaktere katkıda bulunur ve tüm count baytlar işlenmiştir. içinde wcharhiçbir değer depolanmaz, ancak mbstate işlevi yeniden başlatacak şekilde güncelleştirilir.

Açıklamalar

Null işaretçiyse mbchar , işlev çağrıya eşdeğerdir:

mbrtowc(NULL, "", 1, &mbstate)

Bu durumda ve count bağımsız değişkenlerinin wchar değerleri yoksayılır.

Null işaretçi değilse mbchar işlev, sonraki çok baytlı karakteri tamamlamak için gereken bayt mbchar sayısını belirlemek için bayt sayısını incelercount. Sonraki karakter geçerliyse, karşılık gelen çok baytlı karakter null işaretçi değilse içinde wchar depolanır. Karakter karşılık gelen geniş null karakterse, sonuç durumu mbstate ilk dönüştürme durumudur.

İşlev, mbrtowc yeniden başlatılabilirliğine göre işlevinden _mbtowc_lmbtowc farklıdır. Dönüştürme durumu, aynı veya diğer yeniden başlatılabilir işlevlere yapılan sonraki çağrılar için içinde mbstate depolanır. Yeniden başlatılabilir ve yeniden başlatılamayan işlevlerin kullanımı karıştırılırken sonuçlar tanımlanmamıştır. Örneğin, bir uygulama yerine wcslen sonraki bir çağrısı wcsrtombs kullanılıyorsa wcstombsyerine kullanmalıdırwcsrlen.

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.

Örnek

Çok baytlı bir karakteri geniş karakter eşdeğerine dönüştürür.

// crt_mbrtowc.cpp

#include <stdio.h>
#include <mbctype.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>

#define BUF_SIZE 100

int Sample(char* szIn, wchar_t* wcOut, int nMax)
{
    mbstate_t   state = {0}; // Initial state
    size_t      nConvResult,
                nmbLen = 0,
                nwcLen = 0;
    wchar_t*    wcCur = wcOut;
    wchar_t*    wcEnd = wcCur + nMax;
    const char* mbCur = szIn;
    const char* mbEnd = mbCur + strlen(mbCur) + 1;
    char*       szLocal;

    // Sets all locale to French_Canada.1252
    szLocal = setlocale(LC_ALL, "French_Canada.1252");
    if (!szLocal)
    {
        printf("The fuction setlocale(LC_ALL, \"French_Canada.1252\") failed!\n");
        return 1;
    }

    printf("Locale set to: \"%s\"\n", szLocal);

    // Sets the code page associated current locale's code page
    // from a previous call to setlocale.
    if (_setmbcp(_MB_CP_SBCS) == -1)
    {
        printf("The fuction _setmbcp(_MB_CP_SBCS) failed!");
        return 1;
    }

    while ((mbCur < mbEnd) && (wcCur < wcEnd))
    {
        //
        nConvResult = mbrtowc(wcCur, mbCur, 1, &state);
        switch (nConvResult)
        {
            case 0:
            {  // done
                printf("Conversion succeeded!\nMultibyte String: ");
                printf(szIn);
                printf("\nWC String: ");
                wprintf(wcOut);
                printf("\n");
                mbCur = mbEnd;
                break;
            }

            case -1:
            {  // encoding error
                printf("The call to mbrtowc has detected an encoding error.\n");
                mbCur = mbEnd;
                break;
            }

            case -2:
            {  // incomplete character
                if   (!mbsinit(&state))
                {
                    printf("Currently in middle of mb conversion, state = %x\n", state);
                    // state will contain data regarding lead byte of mb character
                }

                ++nmbLen;
                ++mbCur;
                break;
            }

            default:
            {
                if   (nConvResult > 2) // The multibyte should never be larger than 2
                {
                    printf("Error: The size of the converted multibyte is %d.\n", nConvResult);
                }

                ++nmbLen;
                ++nwcLen;
                ++wcCur;
                ++mbCur;
            break;
            }
        }
    }

   return 0;
}

int main(int argc, char* argv[])
{
    char    mbBuf[BUF_SIZE] = "AaBbCc\x9A\x8B\xE0\xEF\xF0xXyYzZ";
    wchar_t wcBuf[BUF_SIZE] = {L''};

    return Sample(mbBuf, wcBuf, BUF_SIZE);
}

Örnek çıktı

Locale set to: "French_Canada.1252"
Conversion succeeded!
Multibyte String: AaBbCcÜïα∩≡xXyYzZ
WC String: AaBbCcÜïα∩≡xXyYzZ

Gereksinimler

Yordam Gerekli başlık
mbrtowc <wchar.h>

Ayrıca bkz.

Veri dönüştürme
Yerel ayar
Çok baytlı karakter dizilerinin yorumlanması