天末凉风

有梦最美,希望相随!

导航

[转]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_t4个字节,很费内存)。所以,我们程序中,如果处理的是GBK字符集时,需要setlocale("zh_CN.GBK"),这样,执行mbstowcs时,系统按GBK的规则去分析字节流,每两个字符转成相应的unicode字符,放入内存里。这两个转换函数,在我们要处理汉字的时候很有用,比如计算汉字长短。虽然有很多人在遇到处理汉字时,喜欢挨个字节自己会分析,但是事实上,在处理一些全角半角之类的符号时,这种方法还是会有问题的。并且有两个宏为两种类型提供了方便,W2Awchar_t*)返回值是char*类型的,A2Wchar*)返回值是wchar_t,但使用之前必须加上这句USES_CONVERSION;
2
iconvwchar_t
由于wchar_t所表示就是unicode字符, 所以wchar_t utf-8的转换定是100%的成功。 iconv支持从各种编码转换成wchar_t
3
、字符集与编码的区别
发现以前对这两个重要问题一直是模糊不清的状况。说到底,字符集就只有两种,一种是char 表示的acsii字符 一种是wchar_t表示的unicode字符。GBK只是运用编码的方式对acsii的扩展。utf-8asciiunicode之间起一个中间人的作用。因为utf-8的外在表现形式与ascii是一样的,程序还是可以像操作ascii码一样来操作utf-8编码后的字节,但是一个utf-8编码后的字符又可以映射到unicode的字符里。这也是utf-8之所以流行的原因了。
4
char wchar_t的处理程序。
既然charwchar_t有本质上的区别,所以,传统的char字符处理程序都不用运用于wchar_t 。像printf/strlen以及std::cout等,相应的要用wprintf std::wcout来代替。这对于我们使用wchar_t还是带来很多不便。

5char* wchar_t*的宏

Const Char*LPCSTRconst wchar_t*LPCWSTRChar*LPSTRwchar_t*LPWSTR

posted on 2009-08-24 23:15  天末凉风  阅读(3597)  评论(0)    收藏  举报