c语言wchar转化为char_linux 下 wchar_t和char的相互转化
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的相互转化相关推荐
- c语言wchar转化为char_烦人的char*,wchar_t*或者WCHAR转换
//将char*转化为whcar_t*,其中lpwchartStr需要释放 int charTowchar_t(wchar_t** lpwchartStr,char* lpcharStr,int *l ...
- c语言 wchar t转char,C++ WINDOWS下 wchar_t *和char * 相互转化总结篇
说道wchar_t和char两个类型大家都不会陌生 wchar_t:在windows下是Unicode 16编码,也就是俗称宽字节 char:当然就是指一个字节,在windows下面默认是gbk编码的 ...
- C++ WINDOWS下 wchar_t *和char * 相互转化总结篇
说道wchar_t和char两个类型大家都不会陌生 wchar_t:在windows下是Unicode 16编码,也就是俗称宽字节 char:当然就是指一个字节,在windows下面默认是gbk编码的 ...
- c语言wchar转化为char_Charwchar | 学步园
http://hi.baidu.com/zeficie/blog/item/219a1550b3a50a5b1038c2d1.html 摘自---考拉的空间 1.C语言相关 对应于char , C语言 ...
- linux下中文的wchar转char,Linux下 wchar_t 与char 转换
为了支持多语言,需要支持宽字符,Linux下用wchar_t表示,wchar_t最大长度4个字节,已经可以囊括世界上所有的语言编码,中文字符在gb2312编码下用2个字节表示,但用utf-8编码需要3 ...
- c语言wchar转化为char_c、c++ char*和wchar*互相转换
1. 问题描述 编写程序时通常会面对一些不同的编码格式,如Unicode和multibytes.在有关字符串的处理时尤其重要,系统编程时通常会遇到很多这样的问题,例如把wchar*的字符串转换为cha ...
- Linux下 wchar_t 与char 转换
为了支持多语言,需要支持宽字符,Linux下用wchar_t表示,wchar_t最大长度4个字节,已经可以囊括世界上所有的语言编码,中文字符在gb2312编码下用2个字节表示,但用utf-8编码需要3 ...
- windows下wchar_t* 转char*
这个在windows下很常见,常用,留个档. 一般用这个函数: size_t wcstombs(char *mbstr,const wchar_t *wcstr,size_t count ); mbs ...
- R语言ggplot2可视化分组变量下的数据分布(线条、色彩配置)、WVPlots包的ShadowHist函数比较分组下的数据直方图、ggplot2分面图facet_wrap可视化分组变量下的数据分布
R语言ggplot2可视化分组变量下的数据分布(线条.色彩配置).WVPlots包的ShadowHist函数比较分组下的数据直方图.ggplot2分面图facet_wrap可视化分组变量下的数据分布 ...
最新文章
- 北斗导航 | GPS 信号频谱分析
- 【渝粤教育】国家开放大学2018年秋季 1137t医院管理 参考试题
- java比较炫的登录界面_html+css实现漂亮的透明登录页面,HTML实现炫酷登录页面...
- 毕设日志——RCNN
- linux socket句柄泄露,socket句柄泄漏问题的定位: losf和strace的联合使用!
- [LeetCode] 342. Power of Four(位操作)
- (愚人节玩笑)历史上最奇怪的圆周率计算法
- 网上值机软件测试,值机员考试(B)题
- 无线自动连接的二维码规则
- 用Matlab绘制正方形圆形椭圆
- hibernate对oracle的文本字段按拼音排序
- win10 下 caffe 的第一个测试程序(附带详细讲解)
- ctf php 流量分析题,CTF平台hackit题目分析与解答
- Pycharm使用GPU,CUDA环境配置
- 亚当斯密的“看不见的手”
- scrapy框架异常之no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
- 如何完整的做一个web项目,进阶篇(1)JSP学习
- 程序员debug必备神器—每日Bug看板(附源码)
- commons-math3-3.6.1-类-DSCompiler-中英对照文档及源码赏析
- 利用opencv进行圆形标志提取和质心计算
热门文章
- c语言的ifelse嵌套,c语言if else语句嵌套
- 地震预测(模拟链表)
- Mybatis 02 基础应用
- 【CV-tracking】多目标跟踪-实战(OpenCV+YOLO+DeepSORT)
- 因无法连接配置数据库导致无法访问SharePoint管理中心
- 售前技术工程师的成长(转)
- 如何删除oracle表的主键约束,oracle删除主键约束的问题m
- python编程语言零基础入门,Python编程基础知识点
- Ubuntu18.04下安装QQ微信——亲测试有效!【同时解决微信不能发送图片问题】
- 常用的8种字符串处理函数