一網打盡中文編碼轉換---6種編碼30個方向的轉換

一網打盡中文編碼轉換——6編碼30個方向的轉換

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寬字符串的轉換.

函數原型為:

int MultiByteToWideChar(UINT CodePage,???????? // 代碼頁DWORD dwFlags,???????? // 轉換標志LPCSTR lpMultiByteStr, // 待轉換的字符串int cbMultiByte,?????? // 待轉換字符串的字節數目LPWSTR lpWideCharStr,? // 轉換后寬字符串的存儲空間int cchWideChar??????? // 轉換后寬字符串的存儲空間大小? 以寬字符大小為單位
);
b.WideCharToMultiByte
該函數完成Unicode寬字符串到多字節字符串的轉換,使用方法具體參見MSDN。
以上兩個函數可以完成大部分的字符串轉換,可以將其封裝成多字節和寬字節之間的轉換函數:
[cpp] view plaincopyprint?
  1. wchar_t*?Coder::MByteToWChar(UINT?CodePage,LPCSTR?lpcszSrcStr)??
  2. {??
  3. ????LPWSTR?lpcwsStrDes=NULL;??
  4. ????int???len=MultiByteToWideChar(CodePage,0,lpcszSrcStr,-1,NULL,0);??
  5. ????lpcwsStrDes=new?wchar_t[len+1];??
  6. ????if(!lpcwsStrDes)??
  7. ????????return?NULL;??
  8. ????memset(lpcwsStrDes,0,sizeof(wchar_t)*(len+1));??
  9. ????len=MultiByteToWideChar(CodePage,0,lpcszSrcStr,-1,lpcwsStrDes,len);??
  10. ????if(len)??
  11. ????????return?lpcwsStrDes;??
  12. ????else??
  13. ????{?????
  14. ????????delete[]?lpcwsStrDes;??
  15. ????????return?NULL;??
  16. ????}??
  17. }??
  18. ??
  19. char*?Coder::WCharToMByte(UINT?CodePage,LPCWSTR?lpcwszSrcStr)??
  20. {??
  21. ????char*?lpszDesStr=NULL;??
  22. ????int?len=WideCharToMultiByte(CodePage,0,lpcwszSrcStr,-1,NULL,0,NULL,NULL);??
  23. ????lpszDesStr=new?char[len+1];??
  24. ????memset(lpszDesStr,0,sizeof(char)*(len+1));??
  25. ????if(!lpszDesStr)??
  26. ????????return?NULL;??
  27. ????len=WideCharToMultiByte(CodePage,0,lpcwszSrcStr,-1,lpszDesStr,len,NULL,NULL);??
  28. ????if(len)??
  29. ????????return?lpszDesStr;??
  30. ????else??
  31. ????{?????
  32. ????????delete[]?lpszDesStr;??
  33. ????????return?NULL;??
  34. ????}??
  35. }???
c.LCMapString 依賴于本地機器的字符轉換函數,尤其是中文編碼在轉換時要依賴于本地機器, 直接利用上述a、b中敘述的函數會產生錯誤,例如直接從GB2312轉換到Big5,利用
MultiByteToWideChar函數將GB2312轉換到Unicode字符串,然后從Unicode字符串利用函數
WideCharToMultiByte轉換成Big5,將會發生錯誤,錯誤的結果如下圖所示:
因此中文編碼轉換時適當使用LCMapString函數,才能完成正確的轉換.
例如:
[cpp] view plaincopyprint?
  1. //簡體中文?GB2312?轉換成?繁體中文BIG5??
  2. char*?Coder::GB2312ToBIG5(const?char*?szGB2312Str)??
  3. {?????????
  4. ????????LCID?lcid?=?MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);??
  5. ????????int?nLength?=?LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGB2312Str,-1,NULL,0);??
  6. ????????char*?pBuffer=new?char[nLength+1];??
  7. ????????if(!pBuffer)??
  8. ????????????return?NULL;??
  9. ????????LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGB2312Str,-1,pBuffer,nLength);??
  10. ????????pBuffer[nLength]=0;??
  11. ????????wchar_t*?pUnicodeBuff?=?MByteToWChar(CP_GB2312,pBuffer);??
  12. ????????char*?pBIG5Buff?=?WCharToMByte(CP_BIG5,pUnicodeBuff);??
  13. ????????delete[]?pBuffer;??
  14. ????????delete[]?pUnicodeBuff;??
  15. ????????return?pBIG5Buff;??
  16. }???
(5)編碼實現 實現Coder類完成編碼轉換工作. Coder類的代碼清單如下:
[cpp] view plaincopyprint?
  1. //?Coder.h:?interface?for?the?Coder?class.??
  2. //??
  3. //??
  4. ??
  5. #if?!defined(AFX_ENCODING_H__2AC955FB_9F8F_4871_9B77_C6C65730507F__INCLUDED_)??
  6. #define?AFX_ENCODING_H__2AC955FB_9F8F_4871_9B77_C6C65730507F__INCLUDED_??
  7. ??
  8. #if?_MSC_VER?>?1000??
  9. #pragma?once??
  10. #endif?//?_MSC_VER?>?1000??
  11. //-----------------------------------------------------------------------------------------------??
  12. //程序用途:實現GB2312、big5、GBK、Unicode、Unicode?big?endian、UTF-8六種編碼的任意裝換??????
  13. //程序作者:湖北師范學院計算機科學與技術學院??王定橋???????????????????????????????????
  14. //核心算法:根據不同編碼特點向其他編碼轉換??
  15. //測試結果:在Windows7?VC6.0環境下測試通過???????????????????????????????????????????????????????
  16. //制作時間:2012-04-24???????????????????????????????????????????????
  17. //代碼版權:代碼公開供學習交流使用??歡迎指正錯誤??改善算法??
  18. //-----------------------------------------------------------------------------------------------??
  19. //Windows代碼頁??
  20. typedef?enum?CodeType??
  21. {??
  22. ????CP_GB2312=936,??
  23. ????CP_BIG5=950,??
  24. ????CP_GBK=0??
  25. }CodePages;??
  26. //txt文件編碼??
  27. typedef?enum?TextCodeType??
  28. {?????
  29. ????GB2312=0,??
  30. ????BIG5=1,??
  31. ????GBK=2,??
  32. ????UTF8=3,??
  33. ????UNICODE=4,??
  34. ????UNICODEBIGENDIAN=5,??
  35. ????DefaultCodeType=-1??
  36. }TextCode;??
  37. class?Coder????
  38. {??
  39. public:??
  40. ????Coder();??
  41. ????virtual?~Coder();??
  42. public:??
  43. ????//默認一次轉換字節大小??
  44. ????UINT??PREDEFINEDSIZE;??
  45. ????//指定轉換時默認一次轉換字節大小??
  46. ????void?SetDefaultConvertSize(UINT?nCount);??
  47. ????//編碼類型轉換為字符串??
  48. ????CString??CodeTypeToString(TextCode?tc);??
  49. ????//文件轉到另一種文件??
  50. ????BOOL?????FileToOtherFile(CString?filesourcepath,?CString?filesavepath,TextCode?tcTo,TextCode??tcCur=DefaultCodeType);??
  51. ????//Unicode?和Unicode?big?endian文件之間轉換??
  52. ????BOOL?????UnicodeEndianFileConvert(CString?filesourcepath,?CString?filesavepath,TextCode?tcTo);??
  53. ????//多字節文件之間的轉換??
  54. ????BOOL?????MBFileToMBFile(CString?filesourcepath,?CString?filesavepath,TextCode?tcTo,TextCode??tcCur=DefaultCodeType);??
  55. ????//Unicode和Unicode?big?endian文件向多字節文件轉換??
  56. ????BOOL?????UnicodeFileToMBFile(CString?filesourcepath,?CString?filesavepath,TextCode?tcTo);??
  57. ????//多字節文件向Unicode和Unicode?big?endian文件轉換??
  58. ????BOOL?????MBFileToUnicodeFile(CString?filesourcepath,CString?filesavepath,TextCode?tcTo,TextCode??tcCur=DefaultCodeType);??
  59. ????//獲取文件編碼類型??
  60. ????TextCode?GetCodeType(CString?filepath);??
  61. ????//繁體中文BIG5?轉換成?簡體中文?GB2312??
  62. ????char*?BIG5ToGB2312(const?char*?szBIG5Str);??
  63. ????//簡體中文?GB2312?轉換成?繁體中文BIG5??
  64. ????char*?GB2312ToBIG5(const?char*?szGB2312Str);??
  65. ????//簡繁中文GBK編碼轉換成簡體中文GB2312??
  66. ????char*?GBKToGB2312(const?char?*szGBkStr);??
  67. ????//簡體中文GB2312編碼轉換成簡繁中文GBK??
  68. ????char*????GB2312ToGBK(const?char?*szGB2312Str);??
  69. ????//簡繁中文GBK轉換成繁體中文Big5??
  70. ????char*?????GBKToBIG5(const?char?*szGBKStr);??
  71. ????//繁體中文BIG5轉換到簡繁中文GBK??
  72. ????char*?????BIG5ToGBK(const?char?*szBIG5Str);??
  73. ????//寬字符串向多字節字符串轉換??
  74. ????char*?????WCharToMByte(UINT?CodePage,LPCWSTR?lpcwszSrcStr);??
  75. ????//多字節字符串向寬字符串轉換??
  76. ????wchar_t*??MByteToWChar(UINT?CodePage,LPCSTR?lpcszSrcStr);??
  77. protected:??
  78. ????//獲取編碼類型對應的代碼頁??
  79. ????UINT?GetCodePage(TextCode?tccur);??
  80. ????//多字節向多字節轉換??
  81. ????char*??MByteToMByte(UINT?CodePageCur,UINT?CodePageTo,const?char*?szSrcStr);??
  82. ????//Unicode和Unicode?big?endian字符串之間的轉換??
  83. ????void???UnicodeEndianConvert(LPWSTR??lpwszstr);??
  84. ????//文件頭常量字節數組??
  85. ????const??static???byte?UNICODEBOM[2];??
  86. ????const??static???byte?UNICODEBEBOM[2];??
  87. ????const??static???byte?UTF8BOM[3];??
  88. ??};??
  89. ??
  90. #endif?//?!defined(AFX_ENCODING_H__2AC955FB_9F8F_4871_9B77_C6C65730507F__INCLUDED_)??
[cpp] view plaincopyprint?
  1. //?Coder.cpp:?implementation?of?the?Coder?class.??
  2. //??
  3. //??
  4. ??
  5. #include?"stdafx.h"??
  6. #include?"Coder.h"??
  7. #include?"Encoding.h"??
  8. ??
  9. #ifdef?_DEBUG??
  10. #undef?THIS_FILE??
  11. static?char?THIS_FILE[]=__FILE__;??
  12. #define?new?DEBUG_NEW??
  13. #endif??
  14. ??
  15. //??
  16. //?Construction/Destruction??
  17. //??
  18. //初始化文件頭常量??
  19. /*static*/?const?????byte?Coder::UNICODEBOM[2]={0xFF,0xFE};??
  20. /*static*/?const?????byte?Coder::UNICODEBEBOM[2]={0xFE,0xFF};??
  21. /*static*/?const?????byte?Coder::UTF8BOM[3]={0xEF,0xBB,0xBF};??
  22. Coder::Coder()??
  23. {??
  24. ???PREDEFINEDSIZE=2097152;//默認一次轉換字節大小?2M字節??
  25. }??
  26. Coder::~Coder()??
  27. {??
  28. ????
  29. }??
  30. //繁體中文BIG5?轉換成?簡體中文?GB2312??
  31. char*?Coder::BIG5ToGB2312(const?char*?szBIG5Str)??
  32. {?????????
  33. ????????CString?msg;??
  34. ????????LCID?lcid?=?MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);??
  35. ????????wchar_t*?szUnicodeBuff?=MByteToWChar(CP_BIG5,szBIG5Str);??
  36. ????????char*?szGB2312Buff?=WCharToMByte(CP_GB2312,szUnicodeBuff);??
  37. ????????int?nLength?=?LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE,?szGB2312Buff,-1,NULL,0);??
  38. ????????char*?pBuffer?=?new?char[nLength?+?1];??
  39. ????????if(!pBuffer)??
  40. ??????????return?NULL;??
  41. ????????memset(pBuffer,0,sizeof(char)*(nLength+1));??
  42. ????????LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength);??
  43. ????????delete[]?szUnicodeBuff;??
  44. ????????delete[]?szGB2312Buff;??
  45. ????????return?pBuffer;??
  46. }??
  47. //?GB2312?轉?GBK??
  48. char*?Coder::GB2312ToGBK(const?char?*szGB2312Str)??
  49. {??
  50. ???????int?nStrLen?=?strlen(szGB2312Str);??
  51. ???????if(!nStrLen)??
  52. ???????????return?NULL;??
  53. ???????LCID?wLCID?=?MAKELCID(MAKELANGID(LANG_CHINESE,?SUBLANG_CHINESE_SIMPLIFIED),?SORT_CHINESE_PRC);??
  54. ???????int?nReturn?=?LCMapString(wLCID,?LCMAP_TRADITIONAL_CHINESE,?szGB2312Str,?nStrLen,?NULL,?0);??
  55. ???????if(!nReturn)??
  56. ??????????return?NULL;??
  57. ???????char?*pcBuf?=?new?char[nReturn?+?1];??
  58. ???????if(!pcBuf)??
  59. ??????????return?NULL;??
  60. ???????memset(pcBuf,0,sizeof(char)*(nReturn?+?1));??
  61. ???????wLCID?=?MAKELCID(MAKELANGID(LANG_CHINESE,?SUBLANG_CHINESE_SIMPLIFIED),?SORT_CHINESE_PRC);??
  62. ???????LCMapString(wLCID,?LCMAP_TRADITIONAL_CHINESE,?szGB2312Str,?nReturn,?pcBuf,?nReturn);??
  63. ???????return?pcBuf;??
  64. }??
  65. //?GBK?轉換成?GB2312??
  66. char*?Coder::GBKToGB2312(const?char?*szGBKStr)??
  67. {??
  68. ????int?nStrLen?=?strlen(szGBKStr);??
  69. ????if(!nStrLen)??
  70. ????????return?NULL;??
  71. ????LCID?wLCID?=?MAKELCID(MAKELANGID(LANG_CHINESE,?SUBLANG_CHINESE_SIMPLIFIED),?SORT_CHINESE_BIG5);??
  72. ????int?nReturn?=?LCMapString(wLCID,?LCMAP_SIMPLIFIED_CHINESE,?szGBKStr,?nStrLen,?NULL,?0);??
  73. ????if(!nReturn)??
  74. ????????return?NULL;??
  75. ????char?*pcBuf?=?new?char[nReturn?+?1];??
  76. ????memset(pcBuf,0,sizeof(char)*(nReturn?+?1));??
  77. ????wLCID?=?MAKELCID(MAKELANGID(LANG_CHINESE,?SUBLANG_CHINESE_SIMPLIFIED),?SORT_CHINESE_BIG5);??
  78. ????LCMapString(wLCID,?LCMAP_SIMPLIFIED_CHINESE,?szGBKStr,?nReturn,?pcBuf,?nReturn);??
  79. ????return?pcBuf;??
  80. }??
  81. //簡繁中文GBK轉換成繁體中文Big5??
  82. char*???Coder::GBKToBIG5(const?char?*szGBKStr)??
  83. {?????
  84. ????char?*pTemp=NULL;??
  85. ????char?*pBuffer=NULL;??
  86. ????pTemp=GBKToGB2312(szGBKStr);??
  87. ????pBuffer=GB2312ToBIG5(pTemp);??
  88. ????delete[]?pTemp;??
  89. ????return?pBuffer;??
  90. }??
  91. //繁體中文BIG5轉換到簡繁中文GBK??
  92. char*???Coder::BIG5ToGBK(const?char?*szBIG5Str)??
  93. {??
  94. ??????char?*pTemp=NULL;??
  95. ??????char?*pBuffer=NULL;??
  96. ??????pTemp=BIG5ToGB2312(szBIG5Str);??
  97. ??????pBuffer=GB2312ToGBK(pTemp);??
  98. ??????delete[]?pTemp;??
  99. ??????return?pBuffer;??
  100. }??
  101. //簡體中文?GB2312?轉換成?繁體中文BIG5??
  102. char*?Coder::GB2312ToBIG5(const?char*?szGB2312Str)??
  103. {?????????
  104. ????????LCID?lcid?=?MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);??
  105. ????????int?nLength?=?LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGB2312Str,-1,NULL,0);??
  106. ????????char*?pBuffer=new?char[nLength+1];??
  107. ????????if(!pBuffer)??
  108. ????????????return?NULL;??
  109. ????????LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGB2312Str,-1,pBuffer,nLength);??
  110. ????????pBuffer[nLength]=0;??
  111. ????????wchar_t*?pUnicodeBuff?=?MByteToWChar(CP_GB2312,pBuffer);??
  112. ????????char*?pBIG5Buff?=?WCharToMByte(CP_BIG5,pUnicodeBuff);??
  113. ????????delete[]?pBuffer;??
  114. ????????delete[]?pUnicodeBuff;??
  115. ????????return?pBIG5Buff;??
  116. }???
  117. //獲取文件編碼類型??
  118. //Unicode編碼文件通過讀取文件頭判別??
  119. //中文編碼通過統計文件編碼類別來判別??判別次數最多為30次????
  120. //中文編碼的判別存在誤差??
  121. TextCode?Coder::GetCodeType(CString?filepath)??
  122. {??
  123. ????CFile?file;??
  124. ????byte??buf[3];//unsigned?char??
  125. ????TextCode?tctemp;??
  126. ????if(file.Open(filepath,CFile::modeRead))??
  127. ????{??????
  128. ????????file.Read(buf,3);??
  129. ????????if(buf[0]==UTF8BOM[0]?&&?buf[1]==UTF8BOM[1]?&&?buf[2]==UTF8BOM[2])??
  130. ????????????return?UTF8;??
  131. ????????else??
  132. ????????if(buf[0]==UNICODEBOM[0]?&&buf[1]==UNICODEBOM[1]?)??
  133. ????????????return?UNICODE?;??
  134. ????????else??
  135. ????????if(buf[0]==UNICODEBEBOM[0]?&&buf[1]==UNICODEBEBOM[1]?)??
  136. ????????????return?UNICODEBIGENDIAN;??
  137. ????????else??
  138. ????????{?????
  139. ????????????int?time=30;??
  140. ????????????while(file.Read(buf,2)?&&time?)??
  141. ????????????{?????
  142. ????????????????if?(?(buf[0]>=176?&&?buf[0]<=247)?&&?(buf[1]>=160?&&?buf[1]<=254)?)??
  143. ????????????????????????????tctemp=GB2312;????
  144. ????????????????else??
  145. ????????????????????if?(?(buf[0]>=129?&&?buf[0]<=255)?&&?(??(?buf[1]>=64?&&?buf[1]<=126)??||??(?buf[1]>=161?&&?buf[1]<=254)?)?)??
  146. ????????????????????????????tctemp=BIG5;??
  147. ????????????????????else??
  148. ????????????????????????if?(?(buf[0]>=129?&&?buf[0]?<=254)?&&?(buf[1]>=64?&&?buf[1]<=254))??
  149. ????????????????????????????tctemp=GBK;???
  150. ????????????????time--;??
  151. ????????????????file.Seek(100,CFile::current);//跳過一定字節??利于統計全文??
  152. ????????????}??
  153. ????????????return?tctemp;??
  154. ????????}??
  155. ????}??
  156. ????else??
  157. ????????return?GB2312;??
  158. }??
  159. //多字節文件轉換為UNICODE、UNICODE?big?endian文件??
  160. BOOL?Coder::MBFileToUnicodeFile(CString?filesourcepath,?CString?filesavepath,TextCode?tcTo,TextCode?tcCur)??
  161. {??
  162. ???TextCode?curtc;??
  163. ???CFile?filesource,filesave;;??
  164. ???char?????*pChSrc=NULL;??
  165. ???char?????*pChTemp=NULL;??
  166. ???wchar_t??*pwChDes=NULL;??
  167. ???DWORD??filelength,readlen,len;??
  168. ???int????bufferlen,strlength;??
  169. ???UINT?CodePage;??
  170. ???//由于存在誤差??允許用戶自定義轉換??
  171. ???if(tcCur!=DefaultCodeType)??
  172. ???????curtc=tcCur;??
  173. ???else??
  174. ???????curtc=GetCodeType(filesourcepath);??
  175. ???if(curtc>UTF8?||?tcTo<?UNICODE?||?curtc==tcTo)??
  176. ???????return?FALSE;??
  177. ???//源文件打開失敗或者源文件無內容?后者保存文件建立失敗???均返回轉換失敗??
  178. ???if(!filesource.Open(filesourcepath,CFile::modeRead)?||?0==(filelength=filesource.GetLength()))??
  179. ???????return?FALSE;??
  180. ???if(?!filesave.Open(filesavepath,CFile::modeCreate|CFile::modeWrite))??
  181. ????????return?FALSE;??
  182. ???//預分配內存??分配失敗則轉換失敗??
  183. ???if(filelength<PREDEFINEDSIZE)??
  184. ???????bufferlen=filelength;??
  185. ???else??
  186. ???????bufferlen=PREDEFINEDSIZE;??
  187. ???pChSrc=new?char[bufferlen+1];??
  188. ???if(!pChSrc)??
  189. ????????????return?FALSE;??
  190. ???//根據當前文件類別指定轉換代碼頁??
  191. ???switch(curtc)??
  192. ???{??
  193. ???case?GB2312:??
  194. ???????CodePage=CP_GB2312;??
  195. ???????break;??
  196. ???case?GBK:??
  197. ???????CodePage=CP_GB2312;//特殊處理??
  198. ???????break;??
  199. ???case?BIG5:??
  200. ???????CodePage=CP_BIG5;??
  201. ???????break;??
  202. ???case?UTF8:??
  203. ???????CodePage=CP_UTF8;??
  204. ???????break;??
  205. ???default:??
  206. ???????break;??
  207. ????}??
  208. ???//UTF8文件跳過文件??
  209. ???if(UTF8==curtc)??
  210. ???????filesource.Seek(3*sizeof(byte),CFile::begin);??
  211. ???//寫入文件頭??
  212. ???if(UNICODEBIGENDIAN==tcTo)??
  213. ???????filesave.Write(&UNICODEBEBOM,2*sizeof(byte));??
  214. ???else??
  215. ???????filesave.Write(&UNICODEBOM,2*sizeof(byte));??
  216. ???//讀取文件??分段轉換知道結束??
  217. ???while(filelength>0)??
  218. ???{??
  219. ???????memset(pChSrc,0,?sizeof(char)*(bufferlen+1));??
  220. ???????if(filelength>PREDEFINEDSIZE)??
  221. ???????????len=PREDEFINEDSIZE;??
  222. ???????else??
  223. ???????????len=filelength;??
  224. ???????readlen=filesource.Read(pChSrc,len);??
  225. ???????if(!readlen)??
  226. ????????????break;??
  227. ???????//GBK轉換為GB2312處理??
  228. ???????if(GBK==curtc)??
  229. ???????{?????
  230. ???????????pChTemp=pChSrc;??
  231. ???????????pChSrc=GBKToGB2312(pChSrc);??
  232. ???????}??
  233. ???????pwChDes=MByteToWChar(CodePage,pChSrc);??
  234. ???????if(pwChDes)??
  235. ???????{??
  236. ???????????if(UNICODEBIGENDIAN==tcTo)??
  237. ???????????????UnicodeEndianConvert(pwChDes);??
  238. ???????????strlength=wcslen(pwChDes)*2;//這里注意寫入文件的長度??
  239. ???????????filesave.Write(pwChDes,strlength);??
  240. ???????????filesave.Flush();??
  241. ???????????filelength-=readlen;??
  242. ???????}??
  243. ???????else??
  244. ???????????break;??
  245. ???}??
  246. ???delete[]?pChSrc;??
  247. ???delete[]?pChTemp;??
  248. ???delete[]?pwChDes;??
  249. ???return?TRUE;??
  250. }??
  251. //??
  252. wchar_t*?Coder::MByteToWChar(UINT?CodePage,LPCSTR?lpcszSrcStr)??
  253. {??
  254. ????LPWSTR?lpcwsStrDes=NULL;??
  255. ????int???len=MultiByteToWideChar(CodePage,0,lpcszSrcStr,-1,NULL,0);??
  256. ????lpcwsStrDes=new?wchar_t[len+1];??
  257. ????if(!lpcwsStrDes)??
  258. ????????return?NULL;??
  259. ????memset(lpcwsStrDes,0,sizeof(wchar_t)*(len+1));??
  260. ????len=MultiByteToWideChar(CodePage,0,lpcszSrcStr,-1,lpcwsStrDes,len);??
  261. ????if(len)??
  262. ????????return?lpcwsStrDes;??
  263. ????else??
  264. ????{?????
  265. ????????delete[]?lpcwsStrDes;??
  266. ????????return?NULL;??
  267. ????}??
  268. }??
  269. ??
  270. char*?Coder::WCharToMByte(UINT?CodePage,LPCWSTR?lpcwszSrcStr)??
  271. {??
  272. ????char*?lpszDesStr=NULL;??
  273. ????int?len=WideCharToMultiByte(CodePage,0,lpcwszSrcStr,-1,NULL,0,NULL,NULL);??
  274. ????lpszDesStr=new?char[len+1];??
  275. ????memset(lpszDesStr,0,sizeof(char)*(len+1));??
  276. ????if(!lpszDesStr)??
  277. ????????return?NULL;??
  278. ????len=WideCharToMultiByte(CodePage,0,lpcwszSrcStr,-1,lpszDesStr,len,NULL,NULL);??
  279. ????if(len)??
  280. ????????return?lpszDesStr;??
  281. ????else??
  282. ????{?????
  283. ????????delete[]?lpszDesStr;??
  284. ????????return?NULL;??
  285. ????}??
  286. }???
  287. //Unicode?和Unicode?big?endian之間字節序的轉換??
  288. void?Coder::UnicodeEndianConvert(LPWSTR?lpwszstr)??
  289. {??????
  290. ?????wchar_t??wchtemp[2];????
  291. ?????long?????index;???
  292. ?????int?len=wcslen(lpwszstr);??
  293. ?????if(!len)??
  294. ?????????return;??
  295. ???//交換高低字節?直到遇到結束符??
  296. ???index=0;??
  297. ???while(?index<len)??
  298. ???{??
  299. ???????wchtemp[0]=lpwszstr[index];??
  300. ???????wchtemp[1]=lpwszstr[index+1];??
  301. ?????????
  302. ???????unsigned?char?high,?low;??
  303. ???????high?=?(wchtemp[0]?&?0xFF00)?>>8;??
  304. ???????low??=?wchtemp[0]?&?0x00FF;??
  305. ???????wchtemp[0]?=?(?low?<<8)?|?high;??
  306. ???????high?=?(wchtemp[1]?&?0xFF00)?>>8;??
  307. ???????low??=?wchtemp[1]?&?0x00FF;??
  308. ???????wchtemp[1]?=?(?low?<<8)?|?high;??
  309. ?????????
  310. ???????lpwszstr[index]=wchtemp[0];??
  311. ???????lpwszstr[index+1]=wchtemp[1];??
  312. ???????index+=2;??
  313. ???}??
  314. }??
  315. //Unicode和Unicode?big?endian文件向多字節文件轉換??
  316. BOOL?Coder::UnicodeFileToMBFile(CString?filesourcepath,?CString?filesavepath,TextCode?tcTo)??
  317. {?????
  318. ????TextCode?curtc;??
  319. ????CFile?filesource,filesave;;??
  320. ????char????*pChDes=NULL;??
  321. ????char????*pChTemp=NULL;??
  322. ????wchar_t?*pwChSrc=NULL;??
  323. ????DWORD??filelength,readlen,len;??
  324. ????int????bufferlen,strlength;??
  325. ????UINT?CodePage;??
  326. ????curtc=GetCodeType(filesourcepath);??
  327. ????//文件轉換類型錯誤?則轉換失敗??
  328. ????if(curtc<=UTF8?||??tcTo>UTF8?||?curtc==tcTo)??
  329. ????????return?FALSE;??
  330. ????//源文件打開失敗或者源文件無內容?后者保存文件建立失敗???均轉換失敗??
  331. ????if(!filesource.Open(filesourcepath,CFile::modeRead)?||?0==(filelength=filesource.GetLength()))??
  332. ????????return?FALSE;??
  333. ????if(?!filesave.Open(filesavepath,CFile::modeCreate|CFile::modeWrite))??
  334. ????????return?FALSE;??
  335. ????//預分配內存??分配失敗則轉換失敗??
  336. ????if(filelength<PREDEFINEDSIZE)??
  337. ????????bufferlen=filelength;??
  338. ????else??
  339. ????????bufferlen=PREDEFINEDSIZE;??
  340. ????pwChSrc=new?wchar_t[(bufferlen/2)+1];??
  341. ????if(!pwChSrc)??
  342. ????????return?FALSE;??
  343. ????//預先決定代碼頁??
  344. ????switch(tcTo)??
  345. ????{?????
  346. ????case?GB2312:??
  347. ????????CodePage=CP_GB2312;??
  348. ????????break;??
  349. ????case?GBK:??
  350. ????????CodePage=CP_GB2312;//特殊處理??
  351. ????????break;??
  352. ????case?BIG5:???
  353. ????????CodePage=CP_GB2312;//特殊處理??
  354. ????????break;??
  355. ????case?UTF8:??
  356. ????????CodePage=CP_UTF8;??
  357. ????????break;??
  358. ????default:??
  359. ????????break;??
  360. ????????}??
  361. ????filesource.Seek(sizeof(wchar_t),CFile::begin);??
  362. ????while(filelength>0)??
  363. ????{??
  364. ????????memset(pwChSrc,0,sizeof(wchar_t)*((bufferlen/2)+1));??
  365. ????????if(filelength>PREDEFINEDSIZE)??
  366. ????????????len=PREDEFINEDSIZE;??
  367. ????????else??
  368. ????????????len=filelength;??
  369. ????????readlen=filesource.Read(pwChSrc,len);??
  370. ????????if(!readlen)??
  371. ????????????break;??
  372. ????????if(UNICODEBIGENDIAN==curtc)??
  373. ????????????UnicodeEndianConvert(pwChSrc);??
  374. ????????pChDes=WCharToMByte(CodePage,pwChSrc);??
  375. ????????//GBK無法直接轉換??BIG5直接轉換會產生錯誤??二者均先轉到GB2312然后再轉到目的類型??
  376. ????????if(GBK==tcTo)??
  377. ????????{??
  378. ????????????pChTemp=pChDes;??
  379. ????????????pChDes=GB2312ToGBK(pChDes);??
  380. ????????}??
  381. ????????if(BIG5==tcTo)??
  382. ????????{??
  383. ????????????pChTemp=pChDes;??
  384. ????????????pChDes=GB2312ToBIG5(pChDes);??
  385. ????????}??
  386. ????????if(pChDes)??
  387. ????????{?????
  388. ????????????strlength=strlen(pChDes);??
  389. ????????????filesave.Write(pChDes,strlength);??
  390. ????????????filesave.Flush();??
  391. ????????????filelength-=readlen;??
  392. ????????}??
  393. ????????else??
  394. ????????????break;??
  395. ????}??
  396. ????delete[]?pChDes;??
  397. ????delete[]?pChTemp;??
  398. ????delete[]?pwChSrc;??
  399. ????return?TRUE;??
  400. }??
  401. //多字節文件轉為多字節文件??
  402. //多字節轉為多字節時,一般先轉為UNICODE類型,再轉換到指定目的類型,實行兩次轉換??
  403. BOOL?Coder::MBFileToMBFile(CString?filesourcepath,?CString?filesavepath,TextCode?tcTo,TextCode??tcCur)??
  404. {??
  405. ????BOOL?bret=FALSE;??
  406. ????TextCode?curtc;??
  407. ????CFile?filesource,filesave;??
  408. ????char????*pChDes=NULL;??
  409. ????char????*pChSrc=NULL;??
  410. ????DWORD??filelength,readlen,len;??
  411. ????int????bufferlen,strlength;??
  412. ????UINT???CodePageCur,CodePageTo;??
  413. ????//由于存在誤差??允許用戶自定義轉換??
  414. ????if(DefaultCodeType!=tcCur)??
  415. ?????????curtc=tcCur;??
  416. ????else??
  417. ????????curtc=GetCodeType(filesourcepath);??
  418. ????//轉換類型錯誤??則返回轉換失敗??
  419. ????if(curtc>UTF8?||?tcTo>UTF8?||?curtc==tcTo)??
  420. ????????return?FALSE;??
  421. ????//源文件打開失敗或者源文件無內容?后者保存文件建立失敗???均返回轉換失敗??
  422. ????if(!filesource.Open(filesourcepath,CFile::modeRead)?||?0==(filelength=filesource.GetLength()))??
  423. ????????return?FALSE;??
  424. ????if(?!filesave.Open(filesavepath,CFile::modeCreate|CFile::modeWrite))??
  425. ????????return?FALSE;??
  426. ????//預分配內存??分配失敗則轉換失敗??
  427. ????if(filelength<PREDEFINEDSIZE)??
  428. ????????bufferlen=filelength;??
  429. ????else??
  430. ????????bufferlen=PREDEFINEDSIZE;??
  431. ????pChSrc=new?char[bufferlen+1];??
  432. ????if(!pChSrc)??
  433. ????????????return?FALSE;??
  434. ????if(UTF8==curtc)??
  435. ????????filesource.Seek(3*sizeof(byte),CFile::begin);??
  436. ????CodePageCur=GetCodePage(curtc);??
  437. ????CodePageTo=GetCodePage(tcTo);??
  438. ????while(filelength>0)??
  439. ????{?????
  440. ????????memset(pChSrc,0,sizeof(char)*(bufferlen+1));??
  441. ????????if(filelength>PREDEFINEDSIZE)??
  442. ????????????len=PREDEFINEDSIZE;??
  443. ????????else??
  444. ????????????len=filelength;??
  445. ????????readlen=filesource.Read(pChSrc,len);??
  446. ????????if(!readlen)??
  447. ????????????break;??
  448. ????????pChDes=MByteToMByte(CodePageCur,CodePageTo,pChSrc);??
  449. ????????if(pChDes)??
  450. ????????{?????
  451. ????????????strlength=strlen(pChDes);??
  452. ????????????filesave.Write(pChDes,strlength);??
  453. ????????????filelength-=readlen;??
  454. ????????}??
  455. ????????else??
  456. ????????????break;??
  457. ????}??
  458. ????delete[]?pChSrc;??
  459. ????delete[]?pChDes;??
  460. ????return?TRUE;??
  461. }??
  462. //Unicode?和Unicode?big?endian文件之間轉換??
  463. BOOL?Coder::UnicodeEndianFileConvert(CString?filesourcepath,?CString?filesavepath,TextCode?tcTo)??
  464. {??
  465. ????TextCode?curtc=GetCodeType(filesourcepath);??
  466. ????if(curtc!=UNICODE?&&?curtc!=UNICODEBIGENDIAN)??
  467. ????????return?FALSE;??
  468. ????if(curtc==tcTo)??
  469. ????????return?FALSE;??
  470. ????CFile?filesource,filesave;;??
  471. ????wchar_t?*pwChDes;??
  472. ????DWORD?length;??
  473. ????if(!filesource.Open(filesourcepath,CFile::modeRead)?||?!filesave.Open(filesavepath,CFile::modeCreate|CFile::modeWrite))??
  474. ????????return?FALSE;??
  475. ????length=filesource.GetLength();??
  476. ????if(!length)??
  477. ????????return?FALSE;??
  478. ????pwChDes=new?wchar_t[(length/2)+1];??
  479. ????if(!pwChDes)??
  480. ????????return?FALSE;??
  481. ????memset(pwChDes,0,sizeof(wchar_t)*((length/2)+1));??
  482. ????filesource.Read(pwChDes,length);??
  483. ????UnicodeEndianConvert(pwChDes);??
  484. ????length=wcslen(pwChDes)*2;??
  485. ????if(UNICODE==tcTo)??
  486. ????????filesave.Write(&UNICODEBOM,2*sizeof(byte));??
  487. ????else??
  488. ????????filesave.Write(&UNICODEBEBOM,2*sizeof(byte));??
  489. ????filesave.Write(pwChDes,length);??
  490. ????filesave.Flush();??
  491. ????delete[]?pwChDes;??
  492. ????return?TRUE;??
  493. }??
  494. //文件轉到另一種文件??
  495. //6種格式文件兩兩轉換??共計30種轉換??
  496. BOOL?Coder::FileToOtherFile(CString?filesourcepath,?CString?filesavepath,?TextCode?tcTo,TextCode??tcCur)??
  497. {?????
  498. ????TextCode?curtc;??
  499. ????BOOL?bret=FALSE;??
  500. ????if(DefaultCodeType!=tcCur)??
  501. ????????curtc=tcCur;??
  502. ????else??
  503. ????????curtc=GetCodeType(filesourcepath);??
  504. ????if(curtc==tcTo)??
  505. ????????return?FALSE;??
  506. ????//UNICODE和UNICODE?big?endian文件之間轉換?共2種??
  507. ????if(curtc>=UNICODE&&?tcTo>=UNICODE)??
  508. ????????????bret=UnicodeEndianFileConvert(filesourcepath,filesavepath,tcTo);??
  509. ????else??
  510. ????????//多字節文件向?UNICODE和UNICODE?big?endian文件之間轉換?共8種??
  511. ????????if(curtc<UNICODE?&&?tcTo>=UNICODE)??
  512. ????????????bret=MBFileToUnicodeFile(filesourcepath,filesavepath,tcTo,curtc);??
  513. ????else??
  514. ????????//UNICODE和UNICODE?big?endian文件向多字節文件轉換?共8種??
  515. ????????if(curtc>=UNICODE?&&?tcTo<UNICODE)??
  516. ????????????bret=UnicodeFileToMBFile(filesourcepath,filesavepath,tcTo);??
  517. ????else??
  518. ????????//多字節文件之間轉換?共12種??
  519. ????????if(curtc<UNICODE?&&?tcTo<UNICODE)??
  520. ????????????bret=MBFileToMBFile(filesourcepath,filesavepath,tcTo,curtc);??
  521. ????return?bret;??
  522. }??
  523. //編碼類型轉換為字符串??
  524. CString?Coder::CodeTypeToString(TextCode?tc)??
  525. {??
  526. ??????CString?strtype;??
  527. ??????switch(tc)??
  528. ??????{??
  529. ??????case?GB2312:??
  530. ???????????strtype=_T("GB2312");??
  531. ???????????break;??
  532. ??????case?BIG5:??
  533. ??????????strtype=_T("Big5");??
  534. ???????????break;??
  535. ??????case?GBK:??
  536. ??????????strtype=_T("GBK");??
  537. ???????????break;??
  538. ??????case?UTF8:??
  539. ??????????strtype=_T("UTF-8");??
  540. ???????????break;??
  541. ??????case?UNICODE:??
  542. ??????????strtype=_T("Unicode");??
  543. ???????????break;??
  544. ??????case?UNICODEBIGENDIAN:??
  545. ??????????strtype=_T("Unicode?big?endian");??
  546. ???????????break;??
  547. ??????}??
  548. ??????return?strtype;??
  549. }??
  550. //多字節向多字節轉換??
  551. char*?Coder::MByteToMByte(UINT?CodePageCur,?UINT?CodePageTo,?const?char*?szSrcStr)??
  552. {??
  553. ????char????*pchDes=NULL;??
  554. ????char????*pchTemp=NULL;??
  555. ????wchar_t?*pwchtemp=NULL;??
  556. ????//三種中文編碼之間轉換??
  557. ????if(CodePageCur!=CP_UTF8??&&?CodePageTo!=CP_UTF8)??
  558. ????{??
  559. ????????switch(CodePageCur)??
  560. ????????{??
  561. ????????????case?CP_GB2312:??
  562. ????????????????{??
  563. ????????????????????if(CP_BIG5==CodePageTo)???
  564. ???????????????????????pchDes=GB2312ToBIG5(szSrcStr);??
  565. ????????????????????else??
  566. ???????????????????????pchDes=GB2312ToGBK(szSrcStr);??
  567. ????????????????????break;??
  568. ????????????????}??
  569. ????????????case?CP_BIG5:??
  570. ????????????????{?????
  571. ????????????????????if(CP_GB2312==CodePageTo)??
  572. ????????????????????????pchDes=BIG5ToGB2312(szSrcStr);??
  573. ????????????????????else??
  574. ????????????????????????pchDes=BIG5ToGBK(szSrcStr);??
  575. ????????????????????break;??
  576. ????????????????}??
  577. ????????????case?CP_GBK:??
  578. ????????????????{?????
  579. ????????????????????if(CP_GB2312==CodePageTo)??
  580. ????????????????????????pchDes=GBKToGB2312(szSrcStr);??
  581. ????????????????????else??
  582. ????????????????????????pchDes=GBKToBIG5(szSrcStr);??
  583. ????????????????????break;??
  584. ????????????????}??
  585. ????????}??
  586. ????}??
  587. ????else??
  588. ????{????//從UTF-8轉到其他多字節??直接轉到GB2312?其他形式用GB2312做中間形式??
  589. ?????????if(CP_UTF8==CodePageCur)??
  590. ?????????{????
  591. ????????????pwchtemp=MByteToWChar(CodePageCur,szSrcStr);??
  592. ????????????if(CP_GB2312==CodePageTo)??
  593. ????????????{??
  594. ????????????????pchDes=WCharToMByte(CP_GB2312,pwchtemp);??
  595. ????????????}??
  596. ????????????else??
  597. ????????????{??????
  598. ????????????????pchTemp=WCharToMByte(CP_GB2312,pwchtemp);??
  599. ?????????????????if(CP_GBK==CodePageTo)??
  600. ????????????????????pchDes=GB2312ToGBK(pchTemp);??
  601. ?????????????????else??
  602. ????????????????????pchDes=GB2312ToBIG5(pchTemp);??
  603. ????????????}??
  604. ?????????}??
  605. ?????????//從其他多字節轉到UTF-8??
  606. ?????????else???
  607. ?????????{??????
  608. ??????????????if(CP_GBK==CodePageCur)??
  609. ??????????????{?????
  610. ??
  611. ??????????????????pchTemp=GBKToGB2312(szSrcStr);??
  612. ??????????????????pwchtemp=MByteToWChar(CP_GB2312,pchTemp);??
  613. ??????????????}??
  614. ??????????????else??
  615. ????????????????pwchtemp=MByteToWChar(CodePageCur,szSrcStr);??
  616. ??????????????pchDes=WCharToMByte(CodePageTo,pwchtemp);??
  617. ?????????}??
  618. ????}??
  619. ????delete[]?pchTemp;??
  620. ????delete[]?pwchtemp;??
  621. ????return?pchDes;??
  622. }??
  623. //獲取編碼類型對應的代碼頁??
  624. UINT?Coder::GetCodePage(TextCode?tccur)??
  625. {??
  626. ??????UINT?CodePage;??
  627. ??????switch(tccur)??
  628. ??????{??
  629. ??????case?GB2312:??
  630. ??????????CodePage=CP_GB2312;??
  631. ??????????break;??
  632. ??????case?BIG5:??
  633. ??????????CodePage=CP_BIG5;??
  634. ??????????break;??
  635. ??????case?GBK:??
  636. ??????????CodePage=CP_GBK;??
  637. ??????????break;??
  638. ??????case?UTF8:??
  639. ??????????CodePage=CP_UTF8;??
  640. ??????????break;??
  641. ??????case?UNICODEBIGENDIAN:??
  642. ??????case?UNICODE:??
  643. ???????????break;??
  644. ????}??
  645. ??????return?CodePage;??
  646. }??
  647. //指定轉換時默認一次轉換字節大小??
  648. void?Coder::SetDefaultConvertSize(UINT?nCount)??
  649. {??????
  650. ?????if(nCount!=0)??
  651. ????????PREDEFINEDSIZE=nCount;??
  652. }??
3.運行效果 在win7 VC 6.0下測試六種編碼的轉換測試通過,30個方向的轉換如下圖所示:

測試程序運行效果如下圖所示:


GB2312轉換到GBK編碼效果如下圖所示:



UTF-8轉換到Big5編碼的效果如下圖所示:


本文代碼及轉碼程序下載 :http://download.csdn.net/user/ziyuanxiazai123

4.尚未解決的問題?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

(1)LCMapString函數的理解還不完全熟悉,其中參數偏多,理解需要一定基礎知識。

(2)為什么記事本程序的轉碼后存在些亂碼,亂碼是正確的嗎?因為我的程序使用了中間過渡形式,因此沒有任何亂碼。

(3)是否有更簡單和清晰的方式實現編碼轉換,待進一步研究。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452225.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452225.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452225.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安裝Ubunutu音頻視頻庫

sudo apt-get install ubuntu-restricted-extras轉載于:https://www.cnblogs.com/or2-/p/9216235.html

十萬服務器秒級管控 騰訊云如何將AIOps用于日常管理?

AIOps&#xff0c;是指基于算法的 IT運維&#xff08;Algorithmic IT Operations&#xff09;&#xff0c;由 Gartner定義的新類別&#xff0c;源自業界之前所說的 ITOA&#xff08;IT Operations and Analytics&#xff09;。我們已經到達了這樣的一個時代&#xff0c;數據科學…

ssm(springMVC + spring+MyBatis) 小例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 整體環境參見本人另一文&#xff1a;http://blog.csdn.net/jiangyu1013/article/details/51983360 此工程訪問入口為index.jsp頁面. 工…

多值依賴

在關系模式中&#xff0c;函數依賴不能表示屬性值之間的一對多聯系&#xff0c;這些屬性之間有些雖然沒有直接關系&#xff0c;但存在間接的關系&#xff0c;把沒有直接聯系、但有間接的聯系稱為多值依賴的數據依賴。例如&#xff0c;教師和學生之間沒有直接聯系&#xff0c;但…

js控制語句練習(回顧)

1、一個小球從100米空中落下&#xff0c;每次反彈一半高度&#xff0c;小球總共經過多少米&#xff0c;請問第10次反彈的高度是多少&#xff1f; //定義初始下落過程高度 var sum1 0; //定義初始上升高度 var sum2 0; //高度變化 var hight 100; for(var i0;i<10;i){ // …

學成在線--13.RabbitMQ工作模式

文章目錄一.Work queues二.Publish/subscribe1.工作模式2.代碼1&#xff09;生產者2&#xff09;消費者3.測試4.思考三.Routing1.工作模式2.代碼1&#xff09;生產者2&#xff09;消費者3.測試4.思考四.Topics1.工作模式2.代碼1&#xff09;生產者2&#xff09;消費者3.測試4.思…

《C++字符串完全指南——第一部分:win32 字符編碼》

《C字符串完全指南--第一部分:win32 字符編碼》 原作者:Michael Dun 譯 者:Dingqiao Wang 引言 毫無疑問&#xff0c;你肯定見過像TCHAR, std::string, BSTR等等這類字符串類型.也包括一些以_tcs開頭的奇怪的宏。也許你正盯著屏幕"哇哇"的發愁&#xff0c;然…

Spring、Spring MVC、MyBatis整合文件配置詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 web.xml的配置 web.xml應該是整個項目最重要的配置文件了&#xff0c;不過servlet3.0中已經支持注解配置方式了。在servlet3.0以前每…

19.C++-(=)賦值操作符、初步編寫智能指針

()賦值操作符 編譯器為每個類默認重載了()賦值操作符默認的()賦值操作符僅完成淺拷貝默認的賦值操作符和默認的拷貝構造函數有相同的存在意義()賦值操作符注意事項 首先要判斷兩個操作數是否相等 返回值一定是 return *this; 返回類型是Type&型,避免連續使用后,出現bug 比如…

windows mysqldump 不成功 1049 1064 報錯

1064 路徑不對&#xff0c;需要cd選到mysql bin目錄下 1049 在cmd里面不需要分號 以下是正確的 E:\phpStudy\PHPTutorial\MySQL\bin>mysqldump -uroot -proot db >db.sql 轉載于:https://www.cnblogs.com/JANCHAN/p/9227388.html

學成在線--14.使用RabbitMQ完成頁面發布

文章目錄一.技術方案二.頁面發布——消費方1.需求分析2.創建Cms Client工程1&#xff09;創建maven工程2&#xff09;配置文件3&#xff09;啟動類3.RabbitmqConfig配置類4.定義消息格式5.PageDao1&#xff09;使用CmsPageRepository 查詢頁面信息2&#xff09;使用CmsSiteRepo…

對象模型中類與類間的關系

類與類之間通常有關聯、聚集、泛化(繼承)、依賴和細化4種關系 1.關聯 關聯表示兩個類的對象之間存在某種語義上的聯系。 (1) 普通關聯 只要在類與類之間存在連接關系就可以用普通關聯表示。普通關聯的圖示符號是連接兩個類之間的直線&#xff0c;如下圖所示。關聯…

記憶講師石偉華微信公眾號2017所有文章匯總(待更新)

17-10-24-不勝光榮的記憶 17-10-26-每日一個超長英文單詞&#xff08;2&#xff09; 17-10-27-每日一個超長英文單詞&#xff08;3&#xff09; 17-10-28-每日一個超長英文單詞&#xff08;4&#xff09; 轉載于:https://www.cnblogs.com/bakblog/p/9228096.html

Log4J日志配置詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Log4j簡介 Log4j有三個主要的組件&#xff1a;Loggers(記錄器)&#xff0c;Appenders (輸出源)和Layouts(布局)。這里可簡單理解為日…

中文編碼雜談

編碼問題的例子 在windows自帶的notepad&#xff08;記事本&#xff09;程序中輸入“聯通”兩個字&#xff0c;保存后再次打開&#xff0c;會發現“聯通”不見了&#xff0c;代之以“”的亂碼。這是windows平臺上典型的中文編碼問題。即文件保存的時候是按照ANSI編碼&#xff…

Java NIO (十四)NIO 和 IO 的區別和適用場景分析

在研究Java NIO和IO API時&#xff0c;很快就會想到一個問題&#xff1a; 什么時候應該使用IO&#xff0c;什么時候應該使用NIO&#xff1f; 在本文中&#xff0c;我將嘗試闡明Java NIO和IO之間的區別&#xff0c;它們的用例以及它們如何影響代碼的設計。 ###Java NIO和IO之間的…

面向對象三種模型之間的關系

功能模型指明了系統應該“做什么”&#xff1b;動態模型明確規定了什么時候(即在何種狀態下接受了什么事件的觸發)做&#xff1b;對象模型則定義了做事情的實體。在面向對象方法學中&#xff0c;對象模型是最基本最重要的&#xff0c;它為其他兩種模型奠定了基礎&#xff0c;人…

android node

pkg install nodejs-current轉載于:https://www.cnblogs.com/insight0912/p/9231342.html

springmvc 中@Controller和@RestController的區別

1.Controller, RestController的共同點 都是用來表示Spring某個類的是否可以接收HTTP請求 2.Controller, RestController的不同點 Controller標識一個Spring類是Spring MVC controller處理器 RestController&#xff1a; a convenience annotation that does nothing more …

easyUI 日期控件修改...

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 個人覺得easyUI挺好用的。 它的中文文檔地址&#xff1a; http://www.zi-han.net/case/easyui/ 日期本來效果是這樣的&#xff1a; 改…