配色: 字号:
cvc字符编码转换(宽字符在c、c++中的转换)
2013-01-08 | 阅:  转:  |  分享 
  
c/vc字符编码转换

2010-08-1221:51?649人阅读?评论(0)?收藏?举报

利用c或者vc编写程序的过程中免不了要做一些字符的转化,比较常见的有从ANSI到UNICODE,或者从UNICODE到ANSI,如何做这样的转换呢?结合笔者的经验,暂时提供两种比较常见的方法,以及各个方法需要注意的问题(1)标准c中的转换可以调用mbstowcs函数函数原型为:size_tmbstowcs(wchar_twcstr,constcharmbstr,size_tcount);头文件为:所支持的操作系统为:ANSI,Win95,WinNT在使用这个函数做转换时需要注意的是对于非英语为本地语言的国家和地区,在使用之前要调用setlocale函数,否则转换出来的字符可能不是用户希望得到的结果。setlocale:函数原形为:charsetlocale(intcategory,constcharlocale);头文件:所支持的操作系统为:ANSI,Win95,WinNT对于简体中文可以使用如下设置:setlocale(LC_ALL,"chs");

为什么一定要调用setlocale呢?因为在C/C++语言标准中定义了其运行时的字符集环境为"C",也就是ASCII字符集的一个子集,那么mbstowcs在工作时会将cstr中所包含的字符串看作是ASCII编码的字符,而不认为是一个包含有chs编码的字符串,所以他会将每一个中文拆成2个ASCII编码进行转换,这样得到的结果就是会形成4个wchar_t的字符组成的串,那么如何才能够让mbstowcs正常工作呢?在调用mbstowcs进行转换之间必须明确的告诉mbstowcs目前cstr串中包含的是chs编码的字符串,通过setlocale(LC_ALL,"chs")函数调用来完成,需要注意的是这个函数会改变整个应用程序的字符集编码方式,必须要通过重新调用setlocale(LC_ALL,"C")函数来还原,这样就可以保证mbstowcs在转换时将cstr中的串看作是中文串,并且转换成为2个wchar_t字符,而不是4个。(注:这段内容转自网络,谢谢chemz)

(2)vc中的转换可以调用MultiByteToWideChar函数函数原型为:intMultiByteToWideChar(UINTCodePage,//codepageDWORDdwFlags,//character-typeoptionsLPCSTRlpMultiByteStr,//addressofstringtomapintcchMultiByte,//numberofbytesinstringLPWSTRlpWideCharStr,//addressofwide-characterbufferintcchWideChar//sizeofbuffer);Header:Declaredinwinnls.h.ImportLibrary:Usekernel32.lib.在使用MultiByteToWideChar函数时需要注意的是:CodePage项可以填CP_ACP或者其他豫定义的字符集(CP_ACP比较常用),dwFlags项填MB_PRECOMPOSED比较常见,需要特别注意的是cchWideChar项最好不要使用wcslen函数计算来得到,因为好多人习惯于在使用变量前先将变量初始化为0(这也是一个很好的编程习惯,可以避免一些不必要的错误),但如果先memset为0,然后再wcslen的话,则MultiByteToWideChar返回已经转换了多少字符,但因为指定的cchWideChar为0,所以不对lpWideCharStr做任何操作,这一点要特别注意,免得出现不必要的错误。

综合以上两种方法,可以说MultiByteToWideChar是mbstowcs的增强版。



献花(0)
+1
(本文系狂神逛街首藏)