诸暨麻将添加redis
您不能選擇超過 %s 個話題 話題必須以字母或數字為開頭,可包含連接號 ('-') 且最長為 35 個字
 
 
 
 
 
 

118 行
2.4 KiB

  1. #include "stdafx.h"
  2. #include "ChineseCode.h"
  3. #include <vector>
  4. CChineseCode::CChineseCode()
  5. {
  6. }
  7. CChineseCode::~CChineseCode()
  8. {
  9. }
  10. void CChineseCode::UTF_8ToUnicode(wchar_t* pOut, char *pText){
  11. char* uchar = (char *)pOut;
  12. uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
  13. uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);
  14. return;
  15. }
  16. void CChineseCode::UnicodeToUTF_8(char* pOut, wchar_t* pText){
  17. // 注意 WCHAR高低字的顺序,低字节在前,高字节在后
  18. char* pchar = (char *)pText;
  19. pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
  20. pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
  21. pOut[2] = (0x80 | (pchar[0] & 0x3F));
  22. return;
  23. }
  24. void CChineseCode::UnicodeToGB2312(char* pOut, wchar_t uData){
  25. WideCharToMultiByte(CP_ACP, NULL, &uData, 1, pOut, sizeof(wchar_t), NULL, NULL);
  26. return;
  27. }
  28. void CChineseCode::Gb2312ToUnicode(wchar_t* pOut, char *gbBuffer){
  29. ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, gbBuffer, 2, pOut, 1);
  30. return;
  31. }
  32. CStringW CChineseCode::Utf8ToUnicode(const char* buf)
  33. {
  34. int len = ::MultiByteToWideChar(CP_UTF8, 0, buf, -1, NULL, 0);
  35. if (len == 0) return L"";
  36. std::vector<wchar_t> unicode(len);
  37. ::MultiByteToWideChar(CP_UTF8, 0, buf, -1, &unicode[0], len);
  38. return &unicode[0];
  39. }
  40. void CChineseCode::GB2312ToUTF_8(std::string& pOut, char *pText, int pLen){
  41. char buf[4];
  42. int nLength = pLen * 3;
  43. char* rst = new char[nLength];
  44. memset(buf, 0, 4);
  45. memset(rst, 0, nLength);
  46. int i = 0;
  47. int j = 0;
  48. while (i < pLen){
  49. //如果是英文直接复制就能
  50. if (*(pText + i) >= 0){
  51. rst[j++] = pText[i++];
  52. }
  53. else{
  54. wchar_t pbuffer;
  55. Gb2312ToUnicode(&pbuffer, pText + i);
  56. UnicodeToUTF_8(buf, &pbuffer);
  57. unsigned short int tmp = 0;
  58. tmp = rst[j] = buf[0];
  59. tmp = rst[j + 1] = buf[1];
  60. tmp = rst[j + 2] = buf[2];
  61. j += 3;
  62. i += 2;
  63. }
  64. }
  65. rst[j] = 0x00;
  66. //返回结果
  67. pOut = rst;
  68. delete[]rst;
  69. return;
  70. }
  71. void CChineseCode::UTF_8ToGB2312(std::string &pOut, char *pText, int pLen){
  72. char * newBuf = new char[pLen+1];
  73. char Ctemp[4];
  74. memset(Ctemp, 0, 4);
  75. int i = 0;
  76. int j = 0;
  77. while (i < pLen){
  78. if (pText > 0){
  79. newBuf[j++] = pText[i++];
  80. }
  81. else{
  82. WCHAR Wtemp;
  83. UTF_8ToUnicode(&Wtemp, pText + i);
  84. UnicodeToGB2312(Ctemp, Wtemp);
  85. newBuf[j] = Ctemp[0];
  86. newBuf[j + 1] = Ctemp[1];
  87. i += 3;
  88. j += 2;
  89. }
  90. }
  91. newBuf[j] = 0x00;
  92. pOut = newBuf;
  93. delete[]newBuf;
  94. return;
  95. }