1. 程式人生 > >字串:多位元組與寬位元組轉換

字串:多位元組與寬位元組轉換

C 標準

#include <stdlib.h>
mbstowcs 多位元組字串轉換為寬字串
wcstombs 寬字串轉換為多位元組字串

在呼叫 mbstowcs 之前,先用 setlocale 將全域性預設 locale 設為當前系統預設 locale
如果是在非中文系統上轉 GBK 編碼,就需要指定中文 locale :

#include <locale.h>
setlocale(LC_ALL, "chs");

wcstombs例子:

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 100 int main( void ) { size_t count; char *pMBBuffer = (char *)malloc(BUFFER_SIZE); wchar_t *pWCBuffer = L"Hello, world.你好,世界。"; setlocale(LC_ALL, "chs"); count = wcstombs(NULL, pWCBuffer, 0); // 只獲取多位元組字串的長度 count = wcstombs(pMBBuffer, pWCBuffer, BUFFER_SIZE); // 轉換並返回多位元組字串的長度
printf(" Characters converted: %u\n", count); printf(" Multibyte character: %s\n\n", pMBBuffer); free(pMBBuffer); }

輸出:

 Characters converted: 25
 Multibyte character: Hello, world.你好,世界。 

mbstowcs例子

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFFER_SIZE 100
int main(void) { size_t count; char *pMBBuffer = "Hello, world.你好,世界。"; wchar_t *pWCBuffer = (wchar_t *)malloc(BUFFER_SIZE); setlocale(LC_ALL, "chs"); count = mbstowcs(NULL, pMBBuffer, 0); count = mbstowcs(pWCBuffer, pMBBuffer, strlen(pMBBuffer)); printf(" Characters converted: %u\n", count); wprintf(L" Widebyte character: %s\n\n", pWCBuffer); free(pWCBuffer); }

輸出:

 Characters converted: 19
 Widebyte character: Hello, world.你好,世界。 

Windows API

#include <Windows.h>
MultiByteToWideChar 多位元組轉寬位元組,並且支援字元編碼相互轉換(gbk–utf8)
WideCharToMultiByte 寬位元組轉多位元組,並且支援字元編碼相互轉換(gbk–utf8)

WideCharToMultiByte例子:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

#define BUFFER_SIZE 100

int main( void )
{
    size_t  count;
    char    *pMBBuffer = (char *)malloc(BUFFER_SIZE);
    wchar_t *pWCBuffer = L"Hello, world.你好,世界。";

    count = WideCharToMultiByte(0, 0, pWCBuffer, wcslen(pWCBuffer)+1, pMBBuffer, BUFFER_SIZE, NULL, NULL); 

    printf(" Characters converted: %u\n",count );
    printf(" Multibyte character: %s\n\n",pMBBuffer );
    free(pMBBuffer);
}

結果:

 Characters converted: 26
 Multibyte character: Hello, world.你好,世界。 

MultiByteToWideChar例子:

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

#define BUFFER_SIZE 100

int main(void)
{
    size_t  count;
    char    *pMBBuffer = "Hello, world.你好,世界。";
    wchar_t *pWCBuffer = (wchar_t *)malloc(BUFFER_SIZE);

    count = MultiByteToWideChar(0, 0, pMBBuffer, strlen(pMBBuffer)+1, pWCBuffer, BUFFER_SIZE);

    setlocale(LC_ALL, "chs"); // 設定wprintf正常顯示中文
    printf(" Characters converted: %u\n", count);
    wprintf(L" Widebyte character: %s\n\n", pWCBuffer);
    free(pWCBuffer);
}

結果:

 Characters converted: 20
 Widebyte character: Hello, world.你好,世界。