1 // Common/StringConvert.cpp
2 
3 #include "StdAfx.h"
4 
5 #include "StringConvert.h"
6 
7 #ifndef _WIN32
8 #include <stdlib.h>
9 #endif
10 
11 #ifdef _WIN32
MultiByteToUnicodeString(const AString & srcString,UINT codePage)12 UString MultiByteToUnicodeString(const AString &srcString, UINT codePage)
13 {
14   UString resultString;
15   if (!srcString.IsEmpty())
16   {
17     int numChars = MultiByteToWideChar(codePage, 0, srcString,
18         srcString.Len(), resultString.GetBuffer(srcString.Len()),
19         srcString.Len() + 1);
20     if (numChars == 0)
21       throw 282228;
22     resultString.ReleaseBuffer(numChars);
23   }
24   return resultString;
25 }
26 
MultiByteToUnicodeString2(UString & dest,const AString & srcString,UINT codePage)27 void MultiByteToUnicodeString2(UString &dest, const AString &srcString, UINT codePage)
28 {
29   dest.Empty();
30   if (!srcString.IsEmpty())
31   {
32     wchar_t *destBuf = dest.GetBuffer(srcString.Len());
33     const char *sp = (const char *)srcString;
34     unsigned i;
35     for (i = 0;;)
36     {
37       char c = sp[i];
38       if ((Byte)c >= 0x80 || c == 0)
39         break;
40       destBuf[i++] = (wchar_t)c;
41     }
42 
43     if (i != srcString.Len())
44     {
45       unsigned numChars = MultiByteToWideChar(codePage, 0, sp + i,
46           srcString.Len() - i, destBuf + i,
47           srcString.Len() + 1 - i);
48       if (numChars == 0)
49         throw 282228;
50       i += numChars;
51     }
52     dest.ReleaseBuffer(i);
53   }
54 }
55 
UnicodeStringToMultiByte2(AString & dest,const UString & s,UINT codePage,char defaultChar,bool & defaultCharWasUsed)56 void UnicodeStringToMultiByte2(AString &dest, const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed)
57 {
58   dest.Empty();
59   defaultCharWasUsed = false;
60   if (!s.IsEmpty())
61   {
62     unsigned numRequiredBytes = s.Len() * 2;
63     char *destBuf = dest.GetBuffer(numRequiredBytes);
64     unsigned i;
65     const wchar_t *sp = (const wchar_t *)s;
66     for (i = 0;;)
67     {
68       wchar_t c = sp[i];
69       if (c >= 0x80 || c == 0)
70         break;
71       destBuf[i++] = (char)c;
72     }
73     defaultCharWasUsed = false;
74     if (i != s.Len())
75     {
76       BOOL defUsed;
77       unsigned numChars = WideCharToMultiByte(codePage, 0, sp + i, s.Len() - i,
78           destBuf + i, numRequiredBytes + 1 - i,
79           &defaultChar, &defUsed);
80       defaultCharWasUsed = (defUsed != FALSE);
81       if (numChars == 0)
82         throw 282229;
83       i += numChars;
84     }
85     dest.ReleaseBuffer(i);
86   }
87 }
88 
UnicodeStringToMultiByte2(AString & dest,const UString & srcString,UINT codePage)89 void UnicodeStringToMultiByte2(AString &dest, const UString &srcString, UINT codePage)
90 {
91   bool defaultCharWasUsed;
92   UnicodeStringToMultiByte2(dest, srcString, codePage, '_', defaultCharWasUsed);
93 }
94 
UnicodeStringToMultiByte(const UString & s,UINT codePage,char defaultChar,bool & defaultCharWasUsed)95 AString UnicodeStringToMultiByte(const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed)
96 {
97   AString dest;
98   defaultCharWasUsed = false;
99   if (!s.IsEmpty())
100   {
101     unsigned numRequiredBytes = s.Len() * 2;
102     BOOL defUsed;
103     int numChars = WideCharToMultiByte(codePage, 0, s, s.Len(),
104         dest.GetBuffer(numRequiredBytes), numRequiredBytes + 1,
105         &defaultChar, &defUsed);
106     defaultCharWasUsed = (defUsed != FALSE);
107     if (numChars == 0)
108       throw 282229;
109     dest.ReleaseBuffer(numChars);
110   }
111   return dest;
112 }
113 
UnicodeStringToMultiByte(const UString & srcString,UINT codePage)114 AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage)
115 {
116   bool defaultCharWasUsed;
117   return UnicodeStringToMultiByte(srcString, codePage, '_', defaultCharWasUsed);
118 }
119 
120 #ifndef UNDER_CE
SystemStringToOemString(const CSysString & srcString)121 AString SystemStringToOemString(const CSysString &srcString)
122 {
123   AString result;
124   CharToOem(srcString, result.GetBuffer(srcString.Len() * 2));
125   result.ReleaseBuffer();
126   return result;
127 }
128 #endif
129 
130 #else
131 
MultiByteToUnicodeString(const AString & srcString,UINT codePage)132 UString MultiByteToUnicodeString(const AString &srcString, UINT codePage)
133 {
134   UString resultString;
135   for (unsigned i = 0; i < srcString.Len(); i++)
136     resultString += (wchar_t)srcString[i];
137   /*
138   if (!srcString.IsEmpty())
139   {
140     int numChars = mbstowcs(resultString.GetBuffer(srcString.Len()), srcString, srcString.Len() + 1);
141     if (numChars < 0) throw "Your environment does not support UNICODE";
142     resultString.ReleaseBuffer(numChars);
143   }
144   */
145   return resultString;
146 }
147 
UnicodeStringToMultiByte(const UString & srcString,UINT codePage)148 AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage)
149 {
150   AString resultString;
151   for (unsigned i = 0; i < srcString.Len(); i++)
152     resultString += (char)srcString[i];
153   /*
154   if (!srcString.IsEmpty())
155   {
156     int numRequiredBytes = srcString.Len() * 6 + 1;
157     int numChars = wcstombs(resultString.GetBuffer(numRequiredBytes), srcString, numRequiredBytes);
158     if (numChars < 0) throw "Your environment does not support UNICODE";
159     resultString.ReleaseBuffer(numChars);
160   }
161   */
162   return resultString;
163 }
164 
165 #endif
166