C95标准化了两种表示大型字符集的方法:宽字符(wide

character,该字符集内每个字符使用相同的位长)以及多字节字符(multibyte

character,每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流(stream)所在的环境背景决定)自从1994年的增补之后,C语言不只提供char类型,还提供wchar_t类型(宽字符),此类型定义在stddef.h

头文件中。wchar_t指定的宽字节类型足以表示某个实现版本扩展字符集的任何元素。

在多字节字符集中,每个字符的编码宽度都不等,可以是一个字节,也可以是多个字节。源代码字符集和运行字符集都可能包含多字节字符。多字节字符可以被用于字符的常量、字符串字面值(string

literal)、标识符(identifier)、注释(comment),以及头文件。

C语言本身并没有定义或指定任何编码集合,或任何字符集(基本源代码字符集和基本运行字符集除外),而是由其实现指定如何编码宽字符,以及要支持什么类型的多字节字符编码机制。

虽然C标准没有支持Unicode字符集,但是许多实现版本使用Unicode转换格式UTF-16和UTF-32来处理宽字符。如果遵循Unicode标准,wchar_t类型至少是16或32位长,而wchar_t类型的一个值就代表一个Unicode字符。

UTF-8是一个由Unicode

CONsortium(万国码联盟)定义的实现,可以表示Unicode字符集的所有字符。UTF-8字符所使用的空间大小从一个字节到四个字节都有可能。

多字节字符和宽字符(也就是wchar_t)的主要差异在于宽字符占用的字节数目都一样,而多字节字符的字节数目不等,这样的表示方式使得多字节字符串比宽字符串更难处理。比方说,即使字符'A'可以用一个字节来表示,但是要在多字节的字符串中找到此字符,就不能使用简单的字节比对,因为即使在某个位置找到相符合的字节,此字节也不见得是一个字符,它可能是另一个不同字符的一部分。然而,多字节字符相当适合用来将文字存储成文件。

C提供了一些标准函数,可以将多字节字符转换为wchar_t,或将宽字符转换为多字节字符。比方说,如果C

编译器使用Unicode 标准的UTF-16

和UTF-8,那么下面调用wctomb()函数就可以获得字符的多字节表示方式(注:wctomb = wide character to

multibyte)。

#include

#include

#include

#include

using namespace std;

size_t get_wchar_size(const char *str)

{

size_t len = strlen(str);

size_t size=0;

size_t i;

for(i=0; i < len; i++)

{

if( str[size] >= 0

&& str[size] <= 127 ) //不是全角字符

size+=sizeof(wchar_t);

else //是全角字符,是中文

{

size+=sizeof(wchar_t);

i+=2;

}

}

return size;

}

char *w2c(const wchar_t *pw)

{

setlocale(LC_ALL,"zh_CN.utf8");

if(!pw)

return NULL;

size_t size= wcslen(pw)*sizeof(wchar_t);

char *pc;

if(!(pc = (char*)malloc(size)))

{

printf("malloc fail");

return NULL;

}

wcstombs(pc,pw,size);

return pc;

}

wchar_t *c2w(const char *pc)

{

setlocale(LC_ALL,"zh_CN.utf8");

if(!pc)

return NULL;

size_t size_of_ch = strlen(pc)*sizeof(char);

size_t size_of_wc = get_wchar_size(pc);

wchar_t *pw;

if(!(pw = (wchar_t*)malloc(size_of_wc)))

{

printf("malloc fail");

return NULL;

}

mbstowcs(pw,pc,size_of_wc);

return pw;

}

int main(void)

{

setlocale(LC_ALL,"zh_CN.utf8");

printf("1 print chinese by wprintf test: \n");

wchar_t *wstr = L"中文";

//wprintf(L"%ls",wstr);

printf("%ls\n",wstr); //ls

printf("2 print chinese by printf test: \n");

char *str = "汉字";

printf("%s\n\n\n",str); //s

printf("3 char and wchar_t size of system test: \n");

printf("%s%d\n","the size of wchar_t is : ",sizeof(wchar_t));

//4

printf("%s%d\n\n\n","the size of char is :

",sizeof(char)); //1

char *pc;

wchar_t *pw = L"中文是abc一门语言abc";

char *tmp = "中文是abc一门语言abc";

printf("%s%s\n","input test wchar_t* ",tmp);

pc = w2c(pw);

printf("4 print char test after w2c (wchar to char):\n");

printf("%s\n",pc);

wchar_t *cw1 = c2w(pc); //char

to wchar

char *wc1 = w2c(cw1); //wchar

to char

printf("5 print char test after w2c c2w and w2c:\n");

printf("%s\n\n\n",wc1);

char *pmc = "abc中文abc";

wchar_t *pmw;

printf("%s%s\n","input test char* ",pmc);

pmw = c2w(pmc);

char *pmc1 = w2c(pmw);

printf("6 print char test after c2w and w2c:\n");

printf("%s\n",pmc1);

cout<

return 0;

}

c语言wchar转化为char_linux 下 wchar_t和char的相互转化相关推荐

  1. c语言wchar转化为char_烦人的char*,wchar_t*或者WCHAR转换

    //将char*转化为whcar_t*,其中lpwchartStr需要释放 int charTowchar_t(wchar_t** lpwchartStr,char* lpcharStr,int *l ...

  2. c语言 wchar t转char,C++ WINDOWS下 wchar_t *和char * 相互转化总结篇

    说道wchar_t和char两个类型大家都不会陌生 wchar_t:在windows下是Unicode 16编码,也就是俗称宽字节 char:当然就是指一个字节,在windows下面默认是gbk编码的 ...

  3. C++ WINDOWS下 wchar_t *和char * 相互转化总结篇

    说道wchar_t和char两个类型大家都不会陌生 wchar_t:在windows下是Unicode 16编码,也就是俗称宽字节 char:当然就是指一个字节,在windows下面默认是gbk编码的 ...

  4. c语言wchar转化为char_Charwchar | 学步园

    http://hi.baidu.com/zeficie/blog/item/219a1550b3a50a5b1038c2d1.html 摘自---考拉的空间 1.C语言相关 对应于char , C语言 ...

  5. linux下中文的wchar转char,Linux下 wchar_t 与char 转换

    为了支持多语言,需要支持宽字符,Linux下用wchar_t表示,wchar_t最大长度4个字节,已经可以囊括世界上所有的语言编码,中文字符在gb2312编码下用2个字节表示,但用utf-8编码需要3 ...

  6. c语言wchar转化为char_c、c++ char*和wchar*互相转换

    1. 问题描述 编写程序时通常会面对一些不同的编码格式,如Unicode和multibytes.在有关字符串的处理时尤其重要,系统编程时通常会遇到很多这样的问题,例如把wchar*的字符串转换为cha ...

  7. Linux下 wchar_t 与char 转换

    为了支持多语言,需要支持宽字符,Linux下用wchar_t表示,wchar_t最大长度4个字节,已经可以囊括世界上所有的语言编码,中文字符在gb2312编码下用2个字节表示,但用utf-8编码需要3 ...

  8. windows下wchar_t* 转char*

    这个在windows下很常见,常用,留个档. 一般用这个函数: size_t wcstombs(char *mbstr,const wchar_t *wcstr,size_t count ); mbs ...

  9. R语言ggplot2可视化分组变量下的数据分布(线条、色彩配置)、WVPlots包的ShadowHist函数比较分组下的数据直方图、ggplot2分面图facet_wrap可视化分组变量下的数据分布

    R语言ggplot2可视化分组变量下的数据分布(线条.色彩配置).WVPlots包的ShadowHist函数比较分组下的数据直方图.ggplot2分面图facet_wrap可视化分组变量下的数据分布 ...

最新文章

  1. 北斗导航 | GPS 信号频谱分析
  2. 【渝粤教育】国家开放大学2018年秋季 1137t医院管理 参考试题
  3. java比较炫的登录界面_html+css实现漂亮的透明登录页面,HTML实现炫酷登录页面...
  4. 毕设日志——RCNN
  5. linux socket句柄泄露,socket句柄泄漏问题的定位: losf和strace的联合使用!
  6. [LeetCode] 342. Power of Four(位操作)
  7. (愚人节玩笑)历史上最奇怪的圆周率计算法
  8. 网上值机软件测试,值机员考试(B)题
  9. 无线自动连接的二维码规则
  10. 用Matlab绘制正方形圆形椭圆
  11. hibernate对oracle的文本字段按拼音排序
  12. win10 下 caffe 的第一个测试程序(附带详细讲解)
  13. ctf php 流量分析题,CTF平台hackit题目分析与解答
  14. Pycharm使用GPU,CUDA环境配置
  15. 亚当斯密的“看不见的手”
  16. scrapy框架异常之no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
  17. 如何完整的做一个web项目,进阶篇(1)JSP学习
  18. 程序员debug必备神器—每日Bug看板(附源码)
  19. commons-math3-3.6.1-类-DSCompiler-中英对照文档及源码赏析
  20. 利用opencv进行圆形标志提取和质心计算

热门文章

  1. c语言的ifelse嵌套,c语言if else语句嵌套
  2. 地震预测(模拟链表)
  3. Mybatis 02 基础应用
  4. 【CV-tracking】多目标跟踪-实战(OpenCV+YOLO+DeepSORT)
  5. 因无法连接配置数据库导致无法访问SharePoint管理中心
  6. 售前技术工程师的成长(转)
  7. 如何删除oracle表的主键约束,oracle删除主键约束的问题m
  8. python编程语言零基础入门,Python编程基础知识点
  9. Ubuntu18.04下安装QQ微信——亲测试有效!【同时解决微信不能发送图片问题】
  10. 常用的8种字符串处理函数