多字节与宽字节转换

转换一个字符

#include <stdlib.h>
int mblen(const char *s,size_t n);
int mbtowc(wchar_t *pwc,cosnt char *s,size_t n);
int wctomb(char *s,wchar_t wchar);

mblen用于检测s指针位置第一个字符占有的字节数,n为要检测的字节数,一般指定为MB_CUR_MAX
mblen返回值:如果s指向汉字返回2,s指定英文字符返回1
mbtowc将一个字符从多字节编码转到宽字节编码
wctomb将一个字符从宽字节编码转到多字节编码

#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
 
int main(int argc,char *argv[]){
    setlocale( LC_ALL, "chinese-simplified" );
 
    char *str = "中国中国abc";
    int size = strlen (str);
    printf ("字节数:%d\n", size);
    printf("中的gbk编码为:0x%x%x\n",(unsigned char)str[0],(unsigned char)str[1]);
 
    //mbtowc
    size = mblen (str, MB_CUR_MAX); //此时为2
    //size=mblen(&str[8],MB_CUR_MAX); //此时为1
    printf("size=%d\n",size);
    wchar_t w[2]={0};
    mbtowc(w,str,size);
    wprintf(L"%s\n",w);
    printf("中的unicode编码为:0x%x\n",w[0]);
 
    //wctomb
    char sav[3]={0};
    wctomb(sav,w[0]);
    printf("sav=%s\n",sav);
    return(0);
}

转换字符串

int mbstowcs(wchar_t *pwcs,const char *s,size_t n);
int wcstombs(char *s,const wchar_t *pwcs,size_t n);

n的作用者:
在mbstowcs中最多生成n个wchar_t对象并保存到pwcs指定的宽字符数组中;
在wcstombs中最多生成n个char保存到s指定的多字节字符数组中

#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
 
int main(int argc,char *argv[]){
    setlocale( LC_ALL, "chinese-simplified" );
 
    char *str = "中国a中国bc";
    wchar_t w[10]={0};
    mbstowcs(w,str,7); //要生成7个wchar_t,而str中刚好有7个完整的字符
    wprintf(L"w=%s\n",w); //与str内容相同,全部输出
 
    char sav[10]={0};
    wcstombs(sav,w,6);//要生成6个char,中国占4个char,a占一个char,还有一个char因不能完整转换"中"字,所以被丢弃,只转换了5个字符
    printf("sav=%s\n",sav); //只输出"中国a"
    return(0);
}
posted @ 2017-02-16 00:25  cfans1993  阅读(1528)  评论(0编辑  收藏  举报