一网打尽中文编码转换
来源:互联网 发布:网络花店创业计划书 编辑:程序博客网 时间:2024/04/30 01:03
多字节字符集: ansi编码,字符长度不定。 中文环境一般为gb2312(gbk向下兼容gb2312,gb2312中汉字在gbk中有相同编码)。
gbk/GB2312 两字节
1.问题提出
在学编程序时,曾经有人问过“你可以编一个记事本程序吗?”当时很不屑一顾,但是随着学习MFC的深入,了解到记事本程序也并非易事,难点就是四种编码之间的转换。
对于编码,这是一个令初学者头疼的问题,特别是对于编码的转换,更是难以捉摸。笔者为了完成毕业设计中的一个编码转换模块,研究了中文编码和常见的字符集后,决定解决"记事本"程序的编码问题,更进一步完成GB2312、Big5、GBK、Unicode 、Unicode big endian、UTF-8共6种编码之间的任意转换。
2.问题解决
(1)编码基础知识
a.了解编码和字符集
这部分内容,我不在赘述,可参见CSDN Ancky的专栏中《各种字符集和编码详解》
博客地址:http://blog.csdn.net/ancky/article/details/2034809
b.单字节、双字节、多字节
这部分内容,可参见我先前翻译的博文《C++字符串完全指南--第一部分:win32 字符编码》
博客地址:http://blog.csdn.net/ziyuanxiazai123/article/details/7482360
c.区域和代码页
这部分内容,可参见博客 http://hi.baidu.com/tzpwater/blog/item/bd4abb0b60bff1db3ac7636a.html
d.中文编码GB2312、GBK、Big5,这部分内容请参见CSDN lengshine 博客中《GB2312、GBK、Big5汉字编码
》,博客地址:http://blog.csdn.net/lengshine/article/details/5470545
e.Windows程序的字符编码
这部分内容,可参见博客http://blog.sina.com.cn/s/blog_4e3197f20100a6z2.html 中《Windows程序的字符编码》
(2)编码总结
a.六种编码的特点
六种编码的特点如下图所示:
b.编码存储差别
ANSI(在简体中文中默认为GB2312)、Unicode、Unicode big endian 、UTF-8存储存在差别。
以中文"你好"二字为例,他们存贮格式如下图所示:
c.GB2312、Big5、GBK编码的区别
三者中汉字均采用二个字节表示,但是字节表示的值范围有所不同,如下图所示:
(3)编码转换方式
6种编码互相转换,由排列组合知识知道共有30个方向的转换.笔者采用的转换方法,
多字节文件与Unicode文件转换如下图所示:
多字节文件之间转换如下图所示:
(4)编码转换使用的三个函数
a.MultiByteToWideChar
该函数完成多字节字符串向Unicode宽字符串的转换.
函数原型为:
<span style="font-size:18px;">int MultiByteToWideChar( UINT CodePage, // 代码页 DWORD dwFlags, // 转换标志 LPCSTR lpMultiByteStr, // 待转换的字符串 int cbMultiByte, // 待转换字符串的字节数目 LPWSTR lpWideCharStr, // 转换后宽字符串的存储空间 int cchWideChar // 转换后宽字符串的存储空间大小 以宽字符大小为单位);</span><span style="font-size:18px;"><strong>b.WideCharToMultiByte</strong>该函数完成Unicode宽字符串到多字节字符串的转换,使用方法具体参见MSDN。以上两个函数可以完成大部分的字符串转换,可以将其封装成多字节和宽字节之间的转换函数:</span><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="CopyToClipboard" title="copy">copy</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="PrintSource" title="print">print</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="About" title="?">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="datatypes">wchar_t</span><span>* Coder::MByteToWChar(</span><span class="datatypes">UINT</span><span> CodePage,</span><span class="datatypes">LPCSTR</span><span> lpcszSrcStr) </span></span></li><li><span>{ </span></li><li class="alt"><span> <span class="datatypes">LPWSTR</span><span> lpcwsStrDes=NULL; </span></span></li><li><span> <span class="datatypes">int</span><span> len=MultiByteToWideChar(CodePage,0,lpcszSrcStr,-1,NULL,0); </span></span></li><li class="alt"><span> lpcwsStrDes=<span class="keyword">new</span><span> </span><span class="datatypes">wchar_t</span><span>[len+1]; </span></span></li><li><span> <span class="keyword">if</span><span>(!lpcwsStrDes) </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> NULL; </span></span></li><li><span> memset(lpcwsStrDes,0,<span class="keyword">sizeof</span><span>(</span><span class="datatypes">wchar_t</span><span>)*(len+1)); </span></span></li><li class="alt"><span> len=MultiByteToWideChar(CodePage,0,lpcszSrcStr,-1,lpcwsStrDes,len); </span></li><li><span> <span class="keyword">if</span><span>(len) </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> lpcwsStrDes; </span></span></li><li><span> <span class="keyword">else</span><span> </span></span></li><li class="alt"><span> { </span></li><li><span> <span class="keyword">delete</span><span>[] lpcwsStrDes; </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> NULL; </span></span></li><li><span> } </span></li><li class="alt"><span>} </span></li><li><span> </span></li><li class="alt"><span><span class="datatypes">char</span><span>* Coder::WCharToMByte(</span><span class="datatypes">UINT</span><span> CodePage,</span><span class="datatypes">LPCWSTR</span><span> lpcwszSrcStr) </span></span></li><li><span>{ </span></li><li class="alt"><span> <span class="datatypes">char</span><span>* lpszDesStr=NULL; </span></span></li><li><span> <span class="datatypes">int</span><span> len=WideCharToMultiByte(CodePage,0,lpcwszSrcStr,-1,NULL,0,NULL,NULL); </span></span></li><li class="alt"><span> lpszDesStr=<span class="keyword">new</span><span> </span><span class="datatypes">char</span><span>[len+1]; </span></span></li><li><span> memset(lpszDesStr,0,<span class="keyword">sizeof</span><span>(</span><span class="datatypes">char</span><span>)*(len+1)); </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>(!lpszDesStr) </span></span></li><li><span> <span class="keyword">return</span><span> NULL; </span></span></li><li class="alt"><span> len=WideCharToMultiByte(CodePage,0,lpcwszSrcStr,-1,lpszDesStr,len,NULL,NULL); </span></li><li><span> <span class="keyword">if</span><span>(len) </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> lpszDesStr; </span></span></li><li><span> <span class="keyword">else</span><span> </span></span></li><li class="alt"><span> { </span></li><li><span> <span class="keyword">delete</span><span>[] lpszDesStr; </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> NULL; </span></span></li><li><span> } </span></li><li class="alt"><span>} </span></li></ol></div><span style="font-size:18px;"><strong>c.LCMapString</strong>依赖于本地机器的字符转换函数,尤其是中文编码在转换时要依赖于本地机器,直接利用上述a、b中叙述的函数会产生错误,例如直接从GB2312转换到Big5,利用</span><pre class="syntax" name="code"><span style="font-size:18px;">MultiByteToWideChar函数将GB2312转换到Unicode字符串,然后从Unicode字符串利用函数</span><pre class="syntax" name="code"><span style="font-size:18px;">WideCharToMultiByte转换成Big5,将会发生错误,错误的结果如下图所示:<img src="http://image51.360doc.com/DownloadImg/2012/05/0420/23727474_6.jpg" alt="" />因此中文编码转换时适当使用LCMapString函数,才能完成正确的转换.例如:</span><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="CopyToClipboard" title="copy">copy</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="PrintSource" title="print">print</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="About" title="?">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//简体中文 GB2312 转换成 繁体中文BIG5</span><span> </span></span></li><li><span><span class="datatypes">char</span><span>* Coder::GB2312ToBIG5(</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span>* szGB2312Str) </span></span></li><li class="alt"><span>{ </span></li><li><span> <span class="datatypes">LCID</span><span> lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC); </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGB2312Str,-1,NULL,0); </span></span></li><li><span> <span class="datatypes">char</span><span>* pBuffer=</span><span class="keyword">new</span><span> </span><span class="datatypes">char</span><span>[nLength+1]; </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>(!pBuffer) </span></span></li><li><span> <span class="keyword">return</span><span> NULL; </span></span></li><li class="alt"><span> LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGB2312Str,-1,pBuffer,nLength); </span></li><li><span> pBuffer[nLength]=0; </span></li><li class="alt"><span> <span class="datatypes">wchar_t</span><span>* pUnicodeBuff = MByteToWChar(CP_GB2312,pBuffer); </span></span></li><li><span> <span class="datatypes">char</span><span>* pBIG5Buff = WCharToMByte(CP_BIG5,pUnicodeBuff); </span></span></li><li class="alt"><span> <span class="keyword">delete</span><span>[] pBuffer; </span></span></li><li><span> <span class="keyword">delete</span><span>[] pUnicodeBuff; </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> pBIG5Buff; </span></span></li><li><span>} </span></li></ol></div><span style="font-size:18px;"><strong>(5)编码实现</strong>实现Coder类完成编码转换工作.Coder类的代码清单如下:</span><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="CopyToClipboard" title="copy">copy</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="PrintSource" title="print">print</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="About" title="?">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">// Coder.h: interface for the Coder class.</span><span> </span></span></li><li><span><span class="comment">//</span><span> </span></span></li><li class="alt"><span><span class="comment">//////////////////////////////////////////////////////////////////////</span><span> </span></span></li><li><span> </span></li><li class="alt"><span><span class="preprocessor">#if !defined(AFX_ENCODING_H__2AC955FB_9F8F_4871_9B77_C6C65730507F__INCLUDED_)</span><span> </span></span></li><li><span><span class="preprocessor">#define AFX_ENCODING_H__2AC955FB_9F8F_4871_9B77_C6C65730507F__INCLUDED_</span><span> </span></span></li><li class="alt"><span> </span></li><li><span><span class="preprocessor">#if _MSC_VER > 1000</span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#pragma once</span><span> </span></span></li><li><span><span class="preprocessor">#endif // _MSC_VER > 1000</span><span> </span></span></li><li class="alt"><span><span class="comment">//-----------------------------------------------------------------------------------------------</span><span> </span></span></li><li><span><span class="comment">//程序用途:实现GB2312、big5、GBK、Unicode、Unicode big endian、UTF-8六种编码的任意装换 </span><span> </span></span></li><li class="alt"><span><span class="comment">//程序作者:湖北师范学院计算机科学与技术学院 王定桥 </span><span> </span></span></li><li><span><span class="comment">//核心算法:根据不同编码特点向其他编码转换</span><span> </span></span></li><li class="alt"><span><span class="comment">//测试结果:在Windows7 VC6.0环境下测试通过 </span><span> </span></span></li><li><span><span class="comment">//制作时间:2012-04-24 </span><span> </span></span></li><li class="alt"><span><span class="comment">//代码版权:代码公开供学习交流使用 欢迎指正错误 改善算法</span><span> </span></span></li><li><span><span class="comment">//-----------------------------------------------------------------------------------------------</span><span> </span></span></li><li class="alt"><span><span class="comment">//Windows代码页</span><span> </span></span></li><li><span><span class="keyword">typedef</span><span> </span><span class="keyword">enum</span><span> CodeType </span></span></li><li class="alt"><span>{ </span></li><li><span> CP_GB2312=936, </span></li><li class="alt"><span> CP_BIG5=950, </span></li><li><span> CP_GBK=0 <span class="comment">//此处特殊处理 CP_GBK仅作一标志 GBK代码页值尚未查得 </span><span> </span></span></li><li class="alt"><span>}CodePages; </span></li><li><span><span class="comment">//txt文件编码</span><span> </span></span></li><li class="alt"><span><span class="keyword">typedef</span><span> </span><span class="keyword">enum</span><span> TextCodeType </span></span></li><li><span>{ </span></li><li class="alt"><span> GB2312=0, </span></li><li><span> BIG5=1, </span></li><li class="alt"><span> GBK=2, </span></li><li><span> UTF8=3, </span></li><li class="alt"><span> UNICODE=4, </span></li><li><span> UNICODEBIGENDIAN=5, </span></li><li class="alt"><span> DefaultCodeType=-1 </span></li><li><span>}TextCode; </span></li><li class="alt"><span><span class="keyword">class</span><span> Coder </span></span></li><li><span>{ </span></li><li class="alt"><span><span class="keyword">public</span><span>: </span></span></li><li><span> Coder(); </span></li><li class="alt"><span> <span class="keyword">virtual</span><span> ~Coder(); </span></span></li><li><span><span class="keyword">public</span><span>: </span></span></li><li class="alt"><span> <span class="comment">//默认一次转换字节大小</span><span> </span></span></li><li><span> <span class="datatypes">UINT</span><span> PREDEFINEDSIZE; </span></span></li><li class="alt"><span> <span class="comment">//指定转换时默认一次转换字节大小</span><span> </span></span></li><li><span> <span class="keyword">void</span><span> SetDefaultConvertSize(</span><span class="datatypes">UINT</span><span> nCount); </span></span></li><li class="alt"><span> <span class="comment">//编码类型转换为字符串</span><span> </span></span></li><li><span> CString CodeTypeToString(TextCode tc); </span></li><li class="alt"><span> <span class="comment">//文件转到另一种文件</span><span> </span></span></li><li><span> <span class="datatypes">BOOL</span><span> FileToOtherFile(CString filesourcepath, CString filesavepath,TextCode tcTo,TextCode tcCur=DefaultCodeType); </span></span></li><li class="alt"><span> <span class="comment">//Unicode 和Unicode big endian文件之间转换</span><span> </span></span></li><li><span> <span class="datatypes">BOOL</span><span> UnicodeEndianFileConvert(CString filesourcepath, CString filesavepath,TextCode tcTo); </span></span></li><li class="alt"><span> <span class="comment">//多字节文件之间的转换</span><span> </span></span></li><li><span> <span class="datatypes">BOOL</span><span> MBFileToMBFile(CString filesourcepath, CString filesavepath,TextCode tcTo,TextCode tcCur=DefaultCodeType); </span></span></li><li class="alt"><span> <span class="comment">//Unicode和Unicode big endian文件向多字节文件转换</span><span> </span></span></li><li><span> <span class="datatypes">BOOL</span><span> UnicodeFileToMBFile(CString filesourcepath, CString filesavepath,TextCode tcTo); </span></span></li><li class="alt"><span> <span class="comment">//多字节文件向Unicode和Unicode big endian文件转换</span><span> </span></span></li><li><span> <span class="datatypes">BOOL</span><span> MBFileToUnicodeFile(CString filesourcepath,CString filesavepath,TextCode tcTo,TextCode tcCur=DefaultCodeType); </span></span></li><li class="alt"><span> <span class="comment">//获取文件编码类型</span><span> </span></span></li><li><span> TextCode GetCodeType(CString filepath); </span></li><li class="alt"><span> <span class="comment">//繁体中文BIG5 转换成 简体中文 GB2312</span><span> </span></span></li><li><span> <span class="datatypes">char</span><span>* BIG5ToGB2312(</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span>* szBIG5Str); </span></span></li><li class="alt"><span> <span class="comment">//简体中文 GB2312 转换成 繁体中文BIG5</span><span> </span></span></li><li><span> <span class="datatypes">char</span><span>* GB2312ToBIG5(</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span>* szGB2312Str); </span></span></li><li class="alt"><span> <span class="comment">//简繁中文GBK编码转换成简体中文GB2312</span><span> </span></span></li><li><span> <span class="datatypes">char</span><span>* GBKToGB2312(</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span> *szGBkStr); </span></span></li><li class="alt"><span> <span class="comment">//简体中文GB2312编码转换成简繁中文GBK</span><span> </span></span></li><li><span> <span class="datatypes">char</span><span>* GB2312ToGBK(</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span> *szGB2312Str); </span></span></li><li class="alt"><span> <span class="comment">//简繁中文GBK转换成繁体中文Big5</span><span> </span></span></li><li><span> <span class="datatypes">char</span><span>* GBKToBIG5(</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span> *szGBKStr); </span></span></li><li class="alt"><span> <span class="comment">//繁体中文BIG5转换到简繁中文GBK</span><span> </span></span></li><li><span> <span class="datatypes">char</span><span>* BIG5ToGBK(</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span> *szBIG5Str); </span></span></li><li class="alt"><span> <span class="comment">//宽字符串向多字节字符串转换</span><span> </span></span></li><li><span> <span class="datatypes">char</span><span>* WCharToMByte(</span><span class="datatypes">UINT</span><span> CodePage,</span><span class="datatypes">LPCWSTR</span><span> lpcwszSrcStr); </span></span></li><li class="alt"><span> <span class="comment">//多字节字符串向宽字符串转换</span><span> </span></span></li><li><span> <span class="datatypes">wchar_t</span><span>* MByteToWChar(</span><span class="datatypes">UINT</span><span> CodePage,</span><span class="datatypes">LPCSTR</span><span> lpcszSrcStr); </span></span></li><li class="alt"><span><span class="keyword">protected</span><span>: </span></span></li><li><span> <span class="comment">//获取编码类型对应的代码页</span><span> </span></span></li><li class="alt"><span> <span class="datatypes">UINT</span><span> GetCodePage(TextCode tccur); </span></span></li><li><span> <span class="comment">//多字节向多字节转换</span><span> </span></span></li><li class="alt"><span> <span class="datatypes">char</span><span>* MByteToMByte(</span><span class="datatypes">UINT</span><span> CodePageCur,</span><span class="datatypes">UINT</span><span> CodePageTo,</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span>* szSrcStr); </span></span></li><li><span> <span class="comment">//Unicode和Unicode big endian字符串之间的转换</span><span> </span></span></li><li class="alt"><span> <span class="keyword">void</span><span> UnicodeEndianConvert(</span><span class="datatypes">LPWSTR</span><span> lpwszstr); </span></span></li><li><span> <span class="comment">//文件头常量字节数组</span><span> </span></span></li><li class="alt"><span> <span class="keyword">const</span><span> </span><span class="keyword">static</span><span> byte UNICODEBOM[2]; </span></span></li><li><span> <span class="keyword">const</span><span> </span><span class="keyword">static</span><span> byte UNICODEBEBOM[2]; </span></span></li><li class="alt"><span> <span class="keyword">const</span><span> </span><span class="keyword">static</span><span> byte UTF8BOM[3]; </span></span></li><li><span> }; </span></li><li class="alt"><span> </span></li><li><span><span class="preprocessor">#endif // !defined(AFX_ENCODING_H__2AC955FB_9F8F_4871_9B77_C6C65730507F__INCLUDED_)</span><span> </span></span></li></ol></div><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="CopyToClipboard" title="copy">copy</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="PrintSource" title="print">print</a><a target=_blank href="http://www.360doc.com/content/12/0504/20/9369336_208682839.shtml" class="About" title="?">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">// Coder.cpp: implementation of the Coder class.</span><span> </span></span></li><li><span><span class="comment">//</span><span> </span></span></li><li class="alt"><span><span class="comment">//////////////////////////////////////////////////////////////////////</span><span> </span></span></li><li><span> </span></li><li class="alt"><span><span class="preprocessor">#include "stdafx.h"</span><span> </span></span></li><li><span><span class="preprocessor">#include "Coder.h"</span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include "Encoding.h"</span><span> </span></span></li><li><span> </span></li><li class="alt"><span><span class="preprocessor">#ifdef _DEBUG</span><span> </span></span></li><li><span><span class="preprocessor">#undef THIS_FILE</span><span> </span></span></li><li class="alt"><span><span class="keyword">static</span><span> </span><span class="datatypes">char</span><span> THIS_FILE[]=__FILE__; </span></span></li><li><span><span class="preprocessor">#define new DEBUG_NEW</span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#endif</span><span> </span></span></li><li><span> </span></li><li class="alt"><span><span class="comment">//////////////////////////////////////////////////////////////////////</span><span> </span></span></li><li><span><span class="comment">// Construction/Destruction</span><span> </span></span></li><li class="alt"><span><span class="comment">//////////////////////////////////////////////////////////////////////</span><span> </span></span></li><li><span><span class="comment">//初始化文件头常量</span><span> </span></span></li><li class="alt"><span><span class="comment">/*static*/</span><span> </span><span class="keyword">const</span><span> byte Coder::UNICODEBOM[2]={0xFF,0xFE}; </span></span></li><li><span><span class="comment">/*static*/</span><span> </span><span class="keyword">const</span><span> byte Coder::UNICODEBEBOM[2]={0xFE,0xFF}; </span></span></li><li class="alt"><span><span class="comment">/*static*/</span><span> </span><span class="keyword">const</span><span> byte Coder::UTF8BOM[3]={0xEF,0xBB,0xBF}; </span></span></li><li><span>Coder::Coder() </span></li><li class="alt"><span>{ </span></li><li><span> PREDEFINEDSIZE=2097152;<span class="comment">//默认一次转换字节大小 2M字节</span><span> </span></span></li><li class="alt"><span>} </span></li><li><span>Coder::~Coder() </span></li><li class="alt"><span>{ </span></li><li><span> </span></li><li class="alt"><span>} </span></li><li><span><span class="comment">//繁体中文BIG5 转换成 简体中文 GB2312</span><span> </span></span></li><li class="alt"><span><span class="datatypes">char</span><span>* Coder::BIG5ToGB2312(</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span>* szBIG5Str) </span></span></li><li><span>{ </span></li><li class="alt"><span> CString msg; </span></li><li><span> <span class="datatypes">LCID</span><span> lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC); </span></span></li><li class="alt"><span> <span class="datatypes">wchar_t</span><span>* szUnicodeBuff =MByteToWChar(CP_BIG5,szBIG5Str); </span></span></li><li><span> <span class="datatypes">char</span><span>* szGB2312Buff =WCharToMByte(CP_GB2312,szUnicodeBuff); </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0); </span></span></li><li><span> <span class="datatypes">char</span><span>* pBuffer = </span><span class="keyword">new</span><span> </span><span class="datatypes">char</span><span>[nLength + 1]; </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>(!pBuffer) </span></span></li><li><span> <span class="keyword">return</span><span> NULL; </span></span></li><li class="alt"><span> memset(pBuffer,0,<span class="keyword">sizeof</span><span>(</span><span class="datatypes">char</span><span>)*(nLength+1)); </span></span></li><li><span> LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength); </span></li><li class="alt"><span> <span class="keyword">delete</span><span>[] szUnicodeBuff; </span></span></li><li><span> <span class="keyword">delete</span><span>[] szGB2312Buff; </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> pBuffer; </span></span></li><li><span>} </span></li><li class="alt"><span><span class="comment">// GB2312 转 GBK</span><span> </span></span></li><li><span><span class="datatypes">char</span><span>* Coder::GB2312ToGBK(</span><span class="keyword">const</span><span> </span><span class="datatypes">char</span><span> *szGB2312Str) </span></span></li><li class="alt"><span>{ </span></li><li><span> <span class="datatypes">int</span><span> nStrLen = strlen(szGB2312Str); </span></span></li><li class="alt"><span> <span class="keyword">if</span><span>(!nStrLen) </span></span></li><li><span> <span class="keyword">return</span><span> NULL; </span></span></li><li class="alt"><span> <span class="datatypes">LCID</span><span> wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC); </span></span></li><li><span> <span class="datatypes">int</span><span> nReturn = LCMapString(wLCID, LCMAP_</span></span><pre class="syntax" name="code"><pre class="syntax" name="code"><pre class="syntax" name="code"><span><span>SIMPLIFIED</span></span>_CHINESE, szGB2312Str, nStrLen, NULL, 0);
- 一网打尽中文编码转换
- 中文编码规则一网打尽
- 中文编码规则一网打尽
- 中文编码规则一网打尽
- 中文编码规则一网打尽
- 一网打尽中文编码转换---6种编码30个方向的转换
- 一网打尽中文编码转换---6种编码30个方向的转换
- Flash 视频(FLV)编码,转换,录制,播放方案一网打尽
- Flash 视频(FLV)编码,转换,录制,播放方案一网打尽
- 编码问题一网打尽
- 编码问题一网打尽
- 编码问题一网打尽
- 编码问题一网打尽
- 中文编码转换说明
- 中文编码转换工具
- 中文编码转换说明
- url中文编码转换
- 中文编码转换技巧
- dijkstra算法
- MPLLCON与UPLLCON
- SAP中如何更改供应商账户组
- 关于近期带项目的一些心得
- SVProgressHUD的用法
- 一网打尽中文编码转换
- Teacher Bo
- 回调机制的理解
- cocos2dx-lua3.12 IOS内购
- System server里创建常见的几个thread
- 关于No resource found that matches the given name
- 关于android开发中的Intent(意图)
- C++类(Class)总结
- 关于opencv中的imread()函数声明