1#include "All.h"
2#include "CharacterHelper.h"
3
4str_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
12str_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
32str_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
51str_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
99str_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
107str_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