Udostępnij za pośrednictwem


mbrtowc

Znak wielobajtowego przekonwertować na równoważne szerokich znaków.

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

Parametry

  • wchar
    Adres szerokich znaków na ciąg przekonwertowany szerokich znaków (typu wchar_t).Wartość ta może być NULL Jeśli wymagane jest bez powrotu szerokości znaków.

  • mbchar
    Adres sekwencji bajtów (znaków wielobajtowych).

  • count
    Liczba bajtów do sprawdzenia.

  • mbstate
    Stan konwersji.Jeśli wartością tą jest NULL, kategoria Stan konwersji wewnętrznej jest używany.

Wartość zwracana

  • 0
    Jeśli następny count lub mniejszą liczbę bajtów uzupełnienie znaków wielobajtowych, która reprezentuje NULL szerokości znaków.

  • > 0
    Jeśli następny count lub mniejszą liczbę bajtów kompletny prawidłowych znaków wielobajtowych, wartość zwracana jest liczba bajtów, które ukończyć znaków wielobajtowych.

  • -1
    Jeśli wystąpi błąd kodowania, w którym to przypadku następnego count lub mniejszą liczbę bajtów nie przyczyniają się do znaków wielobajtowych kompletne i prawidłowe, będzie wartość errno, EILSEQ i stan konwersji niejednoznaczne.

  • -2
    Jeśli następny count bajtów, które przyczyniają się do niekompletnych wielobajtowe i wszystkie Licznik Bajty zostały przetworzone.

Uwagi

Jeśli wcharma wartość ZEROWĄ wartość, jest równoważne wywołanie funkcji:

mbrtowc(NULL, NULL, 1, mbstate)

W tym przypadku wartość argumentów wchar i count są ignorowane.

Jeśli wchar nie jest NULL, funkcja sprawdza, czy count bajtów z mbchar, aby określić wymaganą liczbę bajtów wymaganych do ukończenia następnego znaków wielobajtowych.Jeśli następny znak jest prawidłowa, odpowiednich znaków wielobajtowych jest przechowywana w wchar , jeśli nie ma wartości NULL.Jeśli znak jest odpowiedni znak NULL szeroki, wynikowy Państwo jest Państwem początkowej konwersji.

mbrtowc Funkcja różni się od mbtowc, _mbtowc_l przez jego restartability.Stan konwersji jest przechowywany w mbstate dla kolejnych zaproszeń na to samo lub inne funkcje Przerywalne.Wyniki są niezdefiniowane, przy użyciu funkcji Przerywalne i nonrestartable.Na przykład, aplikacja będzie korzystać z wcsrlen zamiast wcslen, jeśli kolejne wywołania wcsrtombs w przypadku, gdy używana zamiast wcstombs.

Przykład

Konwertuje znaków wielobajtowych do jego szerokości znaku równoważne.

// 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);
}

Przykładowe dane wyjściowe

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

Wymagania

Rozpoczęto wykonywanie procedury

Wymaganego nagłówka

mbrtowc

<wchar.h>

Odpowiednik w programie .NET Framework

Nie dotyczy. Aby wywołać standardowych funkcji C, należy użyć PInvoke. Aby uzyskać więcej informacji, zobacz Przykłady wywołać platformy.

Zobacz też

Informacje

Konwersja danych

Ustawienia regionalne

Interpretacja sekwencje znaków wielobajtowych