[转]char与wchar_t之说
再这之前先看看这段代码:
wchar_t filename[MAX_PATH];
wchar_t* file_t;
char filepath[MAX_PATH];
char file[MAX_PATH];
//TODO: 获取程序名,完全路径
GetModuleFileName(NULL,filename,MAX_PATH);
wcout<<filename<<endl;
//去掉路径
file_t=(_tcsrchr(filename,'\\')+1);
//wchar_t 转char
wcstombs(file,file_t,MAX_PATH);
cout<<file<<endl;
//获取当前路径,完全路径
GetCurrentDirectory(_MAX_PATH,filename);
wcout<<filename<<endl;
wcstombs(filepath,filename,MAX_PATH);
(strrchr(filepath,'\\'))[1]=0;
cout<<filepath<<endl;
结果:
g:\microsoftproject\getpathtest\debug\GetPathTest.exe
GetPathTest.exe
g:\MicrosoftProject\GetPathTest\GetPathTest
g:\MicrosoftProject\GetPathTest\
1、wcstombs 和 mbstowcs
这两个C函数是宽字符wchar_t与普通字符char转换的函数。这两个函数依赖系统的LC_CTYPE的系统变量,在C程序里,如果没有setlocale,程序的LC_CTYPE是 us_en的。也就是说这时,系统会认为输入的字节流都是ascii字符,然后把每个字符转成unicode字符(在Linux中,一个wchar_t占4个字节,很费内存)。所以,我们程序中,如果处理的是GBK字符集时,需要setlocale("zh_CN.GBK"),这样,执行mbstowcs时,系统按GBK的规则去分析字节流,每两个字符转成相应的unicode字符,放入内存里。这两个转换函数,在我们要处理汉字的时候很有用,比如计算汉字长短。虽然有很多人在遇到处理汉字时,喜欢挨个字节自己会分析,但是事实上,在处理一些全角半角之类的符号时,这种方法还是会有问题的。并且有两个宏为两种类型提供了方便,W2A(wchar_t*)返回值是char*类型的,A2W(char*)返回值是wchar_t,但使用之前必须加上这句USES_CONVERSION;
2、iconv和wchar_t
由于wchar_t所表示就是unicode字符, 所以wchar_t 到 utf-8的转换定是100%的成功。 iconv支持从各种编码转换成wchar_t。
3、字符集与编码的区别
发现以前对这两个重要问题一直是模糊不清的状况。说到底,字符集就只有两种,一种是char 表示的acsii字符 一种是wchar_t表示的unicode字符。GBK只是运用编码的方式对acsii的扩展。utf-8在ascii与unicode之间起一个中间人的作用。因为utf-8的外在表现形式与ascii是一样的,程序还是可以像操作ascii码一样来操作utf-8编码后的字节,但是一个utf-8编码后的字符又可以映射到unicode的字符里。这也是utf-8之所以流行的原因了。
4、char 和 wchar_t的处理程序。
既然char和wchar_t有本质上的区别,所以,传统的char字符处理程序都不用运用于wchar_t 。像printf/strlen以及std::cout等,相应的要用wprintf std::wcout来代替。这对于我们使用wchar_t还是带来很多不便。
5、char* 和wchar_t*的宏
Const Char*是LPCSTR,const wchar_t*是LPCWSTR,Char*是LPSTR,wchar_t*是LPWSTR。
浙公网安备 33010602011771号