CodePageConvert.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "StdAfx.h"
  2. #include "CodePageConvert.h"
  3. /******************************************************************************
  4. 把源串转换为宽字符串
  5. ******************************************************************************/
  6. bool MBToWC(wstring & strWC, string strSrc, UINT uiSrcCodePage)
  7. {
  8. //获取转换为宽字符编码所需的长度
  9. if (strSrc == "")
  10. {
  11. strWC = L"";
  12. return true;
  13. }
  14. int nNeedSizeWC = MultiByteToWideChar(uiSrcCodePage, 0
  15. , strSrc.c_str(), -1, NULL, 0);
  16. if (nNeedSizeWC <= 0)
  17. {
  18. return false;
  19. }
  20. //分配足够的字符串空间,减去结束符
  21. strWC.resize(nNeedSizeWC - 1);
  22. //进行转换
  23. if ((int)strWC.size() < nNeedSizeWC - 1)
  24. {
  25. return false;
  26. }
  27. int nSizeWC = MultiByteToWideChar(uiSrcCodePage, 0
  28. , strSrc.c_str(), -1
  29. , (LPWSTR)strWC.c_str(), nNeedSizeWC);
  30. if (nSizeWC <= 0)
  31. {
  32. return false;
  33. }
  34. return true;
  35. }
  36. /******************************************************************************
  37. 把宽字符串转换为目标串
  38. ******************************************************************************/
  39. bool WCToMB(string & strDst, wstring strWC, UINT uiDstCodePage)
  40. {
  41. //获取转换为目标字符编码所需的长度
  42. if (strWC == L"")
  43. {
  44. strDst = "";
  45. return true;
  46. }
  47. int nNeedSizeMB = WideCharToMultiByte(uiDstCodePage, 0
  48. , strWC.c_str(), -1, NULL, 0, NULL, NULL);
  49. if (nNeedSizeMB <= 0)
  50. {
  51. return false;
  52. }
  53. //分配足够的字符串空间
  54. strDst.resize(nNeedSizeMB - 1);
  55. //进行转换
  56. if ((int)strDst.size() < nNeedSizeMB - 1)
  57. {
  58. return false;
  59. }
  60. int nSizeA = WideCharToMultiByte(uiDstCodePage, NULL, strWC.c_str()
  61. , -1, (LPSTR)strDst.c_str(), nNeedSizeMB, NULL, NULL);
  62. if (nSizeA <= 0)
  63. {
  64. return false;
  65. }
  66. return true;
  67. }
  68. /******************************************************************************
  69. 把源串转换为目标串
  70. ******************************************************************************/
  71. bool MBToMB(string & strTrans
  72. , UINT uiDstCodePage, UINT uiSrcCodePage)
  73. {
  74. //先把源串转换为宽字符串
  75. if (strTrans == "")
  76. {
  77. return true;
  78. }
  79. wstring strWC = L"";
  80. if (!MBToWC(strWC, strTrans, uiSrcCodePage))
  81. {
  82. return false;
  83. }
  84. if (strWC == L"")
  85. {
  86. return false;
  87. }
  88. //再把宽字符串转换为目标串
  89. if (!WCToMB(strTrans, strWC, uiDstCodePage))
  90. {
  91. return false;
  92. }
  93. if (strTrans == "")
  94. {
  95. return false;
  96. }
  97. return true;
  98. }