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.