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 wchar
depolanan 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 wchar
depolanı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 wchar
hiç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_l
mbtowc
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 wcstombs
yerine 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ı