mbrtowc

Geçerli yerel bir çoklu bayt karakter eşdeğer geniş bir karakterle, çoklu bayt bir karakter ortasında yeniden başlatmayı yeteneği dönüştürün.

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

Parametreler

  • wchar
    Dönüştürülen geniş karakter dizeyi almak için geniş bir karakter adresi (türü wchar_t).Dönüş hiçbir geniş karakter gerekiyorsa bu değeri null bir işaretçi olabilir.

  • mbchar
    Adresi, bir dizi bayt (çoklu bayt karakter).

  • count
    Denetlenecek bayt sayısı.

  • mbstate
    Dönüştürme durumu nesnesine işaretçi.Bu değer null bir işaretçi ise, bir statik iç dönüştürme durumu nesnesi işlevini kullanıyor.Çünkü iç mbstate_t nesne iş parçacığı güvenli değil, size her zaman kendi geçirmenizi öneririz mbstate bağımsız değişkeni.

Dönüş Değeri

Aşağıdaki değerlerden biri:

  • 0
    Sonraki count veya daha az bayt içinde depolanan null geniş karakter temsil eden çoklu bayt karakter tamamlamak wchar, wchar null bir işaretçi değil.

  • 1'e count, (dahil)
    Sonraki count veya daha az bayt geçerli bir çoklu bayt karakter tamamlayın.Döndürülen değer çoklu bayt karakter tamamlamak bayt sayısıdır.Eşdeğer geniş karakter içinde depolanan wchar, wchar null bir işaretçi değil.

  • (size_t)(-1)
    Kodlama bir hata oluştu.Sonraki count veya daha az bayt tam ve geçerli bir çoklu bayt karaktere katkıda değil.Bu durumda, errno EILSEQ ve dönüştürme shift durumunda ayarlanır mbstate belirtilmezse.

  • (size_t)-(2)
    Sonraki count bayt katkıda tamamlanmamış ancak olası geçerli bir çoklu bayt karakter ve tüm için count bayt işlenen.Hiçbir değer depolanır wchar, ancak mbstate işlev yeniden başlatmak için güncelleştirilir.

Notlar

Varsa mbchar null bir işaretçi işlev çağrısına eşdeğerdir:

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

Bu durumda, bağımsız değişkenler değerini wchar ve count göz ardı edilir.

Varsa mbchar null bir işaretçi değil işlev inceler count baytlar mbchar gerekli çoklu bayt sonraki karakteri tamamlamak için gereken bayt sayısını belirlemek için.Sonraki karakteri geçerliyse, ilgili çoklu bayt karakteri depolanır wchar null bir işaretçi değilse.Karakter geniş null karşılık gelen karakter, sonuç durumunu mbstate ilk dönüştürme durum şeklindedir.

mbrtowc İşlevi farklıdır mbtowc, _mbtowc_l kendi restartability tarafından.Dönüştürme durumu içinde depolanan mbstate sonraki çağrılar aynı veya diğer yeniden başlatılabilir işlevler için.Sonuçları yeniden başlatılabilir ve nonrestartable işlevleri kullanımını kullanırken tanımlanmamış.Örneğin, bir uygulama kullanması gereken wcsrlen yerine wcslen bir sonraki çağrı, wcsrtombs yerine kullanılan wcstombs.

Örnek

Çoklu bayt karakter kendi geniş karakter için eşdeğer 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 >

.NET Framework Eşdeğeri

Uygulanamaz. Standart C işlevini çağırmak için PInvoke kullanın. Daha fazla bilgi için Platform çağırma örnekler.

Ayrıca bkz.

Başvuru

Veri Dönüştürme

Yerel Ayar

Çok Baytlı Karakter Sıralarının Yorumu