1 #include "All.h" 2 #include "CharacterHelper.h" 3 4 str_ansi * GetANSIFromUTF8(const str_utf8 * pUTF8) 5 { 6 str_utf16 * pUTF16 = GetUTF16FromUTF8(pUTF8); 7 str_ansi * pANSI = GetANSIFromUTF16(pUTF16); 8 delete [] pUTF16; 9 return pANSI; 10 } 11 12 str_ansi * GetANSIFromUTF16(const str_utf16 * pUTF16) 13 { 14 const int nCharacters = pUTF16 ? wcslen(pUTF16) : 0; 15 #ifdef _WIN32 16 int nANSICharacters = (2 * nCharacters); 17 str_ansi * pANSI = new str_ansi [nANSICharacters + 1]; 18 memset(pANSI, 0, (nANSICharacters + 1) * sizeof(str_ansi)); 19 if (pUTF16) 20 WideCharToMultiByte(CP_ACP, 0, pUTF16, -1, pANSI, nANSICharacters, NULL, NULL); 21 #else 22 str_utf8 * pANSI = new str_utf8 [nCharacters + 1]; 23 // for (int z = 0; z < nCharacters; z++) 24 // pANSI[z] = (pUTF16[z] >= 256) ? '?' : (str_utf8) pUTF16[z]; 25 // pANSI[nCharacters] = 0; 26 memcpy(pANSI, pUTF16, nCharacters + 1); 27 #endif 28 29 return (str_ansi *) pANSI; 30 } 31 32 str_utf16 * GetUTF16FromANSI(const str_ansi * pANSI) 33 { 34 const int nCharacters = pANSI ? strlen(pANSI) : 0; 35 str_utf16 * pUTF16 = new str_utf16 [nCharacters + 1]; 36 37 #ifdef _WIN32 38 memset(pUTF16, 0, sizeof(str_utf16) * (nCharacters + 1)); 39 if (pANSI) 40 MultiByteToWideChar(CP_ACP, 0, pANSI, -1, pUTF16, nCharacters); 41 #else 42 // for (int z = 0; z < nCharacters; z++) 43 // pUTF16[z] = (str_utf16) ((str_utf8) pANSI[z]); 44 // pUTF16[nCharacters] = 0; 45 strcpy(pUTF16, pANSI); 46 #endif 47 48 return pUTF16; 49 } 50 51 str_utf16 * GetUTF16FromUTF8(const str_utf8 * pUTF8) 52 { 53 #if 0 54 // get the length 55 int nCharacters = 0; int nIndex = 0; 56 while (pUTF8[nIndex] != 0) 57 { 58 if ((pUTF8[nIndex] & 0x80) == 0) 59 nIndex += 1; 60 else if ((pUTF8[nIndex] & 0xE0) == 0xE0) 61 nIndex += 3; 62 else 63 nIndex += 2; 64 65 nCharacters += 1; 66 } 67 68 // make a UTF-16 string 69 str_utf16 * pUTF16 = new str_utf16 [nCharacters + 1]; 70 nIndex = 0; nCharacters = 0; 71 while (pUTF8[nIndex] != 0) 72 { 73 if ((pUTF8[nIndex] & 0x80) == 0) 74 { 75 pUTF16[nCharacters] = pUTF8[nIndex]; 76 nIndex += 1; 77 } 78 else if ((pUTF8[nIndex] & 0xE0) == 0xE0) 79 { 80 pUTF16[nCharacters] = ((pUTF8[nIndex] & 0x1F) << 12) | ((pUTF8[nIndex + 1] & 0x3F) << 6) | (pUTF8[nIndex + 2] & 0x3F); 81 nIndex += 3; 82 } 83 else 84 { 85 pUTF16[nCharacters] = ((pUTF8[nIndex] & 0x3F) << 6) | (pUTF8[nIndex + 1] & 0x3F); 86 nIndex += 2; 87 } 88 89 nCharacters += 1; 90 } 91 pUTF16[nCharacters] = 0; 92 #endif 93 int nCharacters = strlen(reinterpret_cast<const char*>(pUTF8)); 94 str_utf16 * pUTF16 = new str_utf16 [nCharacters + 1]; 95 memcpy(pUTF16, pUTF8, nCharacters + 1); 96 return pUTF16; 97 } 98 99 str_utf8 * GetUTF8FromANSI(const str_ansi * pANSI) 100 { 101 str_utf16 * pUTF16 = GetUTF16FromANSI(pANSI); 102 str_utf8 * pUTF8 = GetUTF8FromUTF16(pUTF16); 103 delete [] pUTF16; 104 return pUTF8; 105 } 106 107 str_utf8 * GetUTF8FromUTF16(const str_utf16 * pUTF16) 108 { 109 #if 0 110 // get the size(s) 111 int nCharacters = wcslen(pUTF16); 112 int nUTF8Bytes = 0; 113 for (int z = 0; z < nCharacters; z++) 114 { 115 if (pUTF16[z] < 0x0080) 116 nUTF8Bytes += 1; 117 else if (pUTF16[z] < 0x0800) 118 nUTF8Bytes += 2; 119 else 120 nUTF8Bytes += 3; 121 } 122 123 // allocate a UTF-8 string 124 str_utf8 * pUTF8 = new str_utf8 [nUTF8Bytes + 1]; 125 126 // create the UTF-8 string 127 int nUTF8Index = 0; 128 for (int z = 0; z < nCharacters; z++) // SHINTA 129 { 130 if (pUTF16[z] < 0x0080) 131 { 132 pUTF8[nUTF8Index++] = (str_utf8) pUTF16[z]; 133 } 134 else if (pUTF16[z] < 0x0800) 135 { 136 pUTF8[nUTF8Index++] = 0xC0 | (pUTF16[z] >> 6); 137 pUTF8[nUTF8Index++] = 0x80 | (pUTF16[z] & 0x3F); 138 } 139 else 140 { 141 pUTF8[nUTF8Index++] = 0xE0 | (pUTF16[z] >> 12); 142 pUTF8[nUTF8Index++] = 0x80 | ((pUTF16[z] >> 6) & 0x3F); 143 pUTF8[nUTF8Index++] = 0x80 | (pUTF16[z] & 0x3F); 144 } 145 } 146 pUTF8[nUTF8Index++] = 0; 147 #endif 148 int nCharacters = strlen(pUTF16); 149 str_utf8 * pUTF8 = new str_utf8 [nCharacters + 1]; 150 memcpy(pUTF8, pUTF16, nCharacters + 1); 151 // return the UTF-8 string 152 return pUTF8; 153 } 154