对于宽字符的初步运用
来源:互联网 发布:java英语词汇 编辑:程序博客网 时间:2024/06/04 21:46
最近要用到宽字符,于是乎学习了两天关于宽字符方面的东西
宽字符是双字节多语言字符代码,最简单来说中文一般就可以用宽字符来表示,因为一个中文占用两个字节,如果直接输出会导致乱码。
我用的是codeblocks,可能会需要更改一下编码形式(如果依照本文代码发现会报错的话极有可能是编码问题)
方法是:打开codeblocks-settings-compiler,在窗口下选择other options在下面的窗口输入
-finput-charset=GBK
-fexec-charset=GBK
即可。
首先包含头文件#i nclude <wchar.h>
定义一个宽字符:wchar_t 变量名='定义的值';
例 wchar_t c='A';
定义一个指向宽字符的指针wchar_t *指针名=L"内容";
例 wchar_t *p=L“hello";
定义一个宽字符字符数组 wchar_t 数组名[]=L"内容";
例 wchar_t p[]=L"hello";
相对应于字符串的strlen,strcmp,strcpy,同样对于宽字符有自己的一套函数,详细比对可参照http://blog.chinaunix.net/uid-20454812-id-1675838.html
举几个常见的:
如果定义了 wchar_t *p=L"hello";
wcslen(p)的返回值就是5
mbstowcs()非常好用,比如我输入的一段话是用普通字符串保存的,可以将其转成宽字符串处理,使用方法mbstowcs(宽字符串,原来的普通字符串,截取的长度)
wcstombs/mbstowcs是实现转换的一对函数. 这两个c的库函数其实内部也就是对刚刚windows的api和接下来我们要说的iconv的封装。使用时要注意,如果涉及到中文,要先setlocale,当设置好正确的locale,函数内部才能找到正确的字符集进行转换。
设置方法:setlocale( LC_ALL, "CHS" ); //将CHS设为你系统用的编码
我的相关代码:目的,识别出标题,并且标题的两边加标签<section>和</section>而如果是内容则加标签<maintext>和<maintext>(当然两边也要加section),文章开头结尾分别加<docunment>和</docunment>
#include <stdio.h>#include <Windows.h>#include <string.h>#include <stdlib.h>#include <wchar.h>#include <locale.h>#ifndef UNICODE #define UNICODE#endif#ifdef UNICODE #ifndef _UNICODE #define _UNICODE #endif#endif FILE *fp2;int formnum;//记录之前出现了几种格式int Find(char p[],char ch){ int l=strlen(p); int i; for (i=0;i<10;i++) if (p[i]==ch) return 1; return 0;}int find(int p[],int k){ int i; for (i=0;i<formnum;i++) if (p[i]==k) return 1; return 0;}int findchinese(wchar_t p[],wchar_t t[]){ int i,l; wchar_t *q; l=wcslen((wchar_t*)p); for (i=0;i<l;i=i+1) if((q=wcschr((wchar_t*)t,p[i]))!=NULL) return 1; return 0;}int main(){ setlocale( LC_ALL, "CHS" ); //将CHS设为你系统用的编码 FILE *fp; char s[1000][1000];//最重要的二维数组,存储已经访问过的所有节点 int i,k; int sum;//sum的作用是判断是哪种格式和是否含有关键区分的数字和符号 int form[1000];//存储之前出现的格式 int num;//代表是存储的maintext的第几行 char temp[1000][1000];//用来存储普通段落 wchar_t yi[]=L"一二三四五六七八九十"; wchar_t ttt[1000]; wchar_t tttt[]=L";"; int count; fp=fopen("d://2.txt","r"); fp2=fopen("d://1.txt","w"); k=0; num=0; formnum=0; fprintf(fp2,"<?xml version='1.0' encoding='ISO-8859-1'?>\n<docunment>"); memset(temp,0,sizeof(temp)); memset(s,0,sizeof(s)); memset(form,0,sizeof(form)); while(fgets(s[k],1000,fp)!=NULL)//fgets原型:数组首地址,读入的元素个数,链接的文件 { sum=0; count=0; s[k][strlen(s[k])-1]='\0'; for (i=0;i<strlen(s[k]);i++)//防止某一行全是空行 if (s[k][i]==' ')count++; if ((strlen(s[k])-count)<=3)continue; if (Find(s[k],'1')||Find(s[k],'2')||Find(s[k],'3')||Find(s[k],'4')||Find(s[k],'5')||Find(s[k],'6')||Find(s[k],'7')||Find(s[k],'8')||Find(s[k],'9')) sum=sum+2; mbstowcs(ttt,s[k],10000); if (findchinese(ttt,yi)) sum=sum+4; if (Find(s[k],':')||(findchinese(ttt,tttt))) sum=sum+8; if (sum==0)//如果不含有关键字符,那么只是普通段落 { if (num==0)//如果是普通段落的第一行 fprintf(fp2,"\n<section>\n<maintext>"); strcpy(temp[num],s[k]); num++; } else//如果含有关键字,则首先将保存的temp中的普通段落输出 { for (i=0;i<num;i++) fprintf(fp2,"%s\n",temp[i]); if (num>0)fprintf(fp2,"</maintext>\n</section>\n"); num=0; memset(temp,0,sizeof(temp)); if (find(form,num))//如果之前出现过该种格式,就输出</section>同时将这种格式删除 { fprintf(fp2,"\n</section>\n"); formnum--; } else { //如果之前没有出现过这种格式,将这种格式记录下来 fprintf(fp2,"<section>"); fprintf(fp2,"%s",s[k]); fprintf(fp2,"</section>\n"); form[formnum++]=sum; } } } for (i=0;i<num;i++) fprintf(fp2,"%s",temp[i]); num=0; fprintf(fp2,"</maintext>\n</section>\n"); fprintf(fp2,"</docunment>"); fclose(fp); fclose(fp2); return 0;}
- 对于宽字符的初步运用
- 对于SOA的初步了解
- 对于多线程的初步认识
- 对于Retrofit的初步学习
- 对于编码的初步认识
- 对于数据结构的初步了解
- 对于SVN的初步理解
- Auto Layout的初步运用。
- 字符指针的运用
- 转义字符的运用
- 对于makefile的初步的理解
- 运用javascript对于前台数据的校验
- 对于初步编程者的一点儿建议
- 对于初步编程者的一点儿建议
- 【新手】对于MFC的初步看法
- 对于MIPI接口的认识--初步总结
- 对于MySQL的存储过程初步了解
- 对于material design的初步理解
- 数据结构之快速排序
- 关于public定义方法和类的作用,以及包和import语句
- Unity Editor 编写unity插件类
- JAVA文件操作之默认字符集编码
- 6174的问题
- 对于宽字符的初步运用
- 我为什么要写blog
- Activiti学习笔记三-开发部署bpmn流程文件
- 欢迎使用CSDN-markdown编辑器
- C++primer学习:重载运算符(3)
- id ,NSObject, id<NSObject>区别
- 【NOIP】10.24/25 总结
- HDU 1556 Color the ball 线段树模板题
- ARM9开发板FL2440移植Linux-3.0内核————触摸屏的移植