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 12UString 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 27void 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 56void 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 89void UnicodeStringToMultiByte2(AString &dest, const UString &srcString, UINT codePage) 90{ 91 bool defaultCharWasUsed; 92 UnicodeStringToMultiByte2(dest, srcString, codePage, '_', defaultCharWasUsed); 93} 94 95AString 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 114AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) 115{ 116 bool defaultCharWasUsed; 117 return UnicodeStringToMultiByte(srcString, codePage, '_', defaultCharWasUsed); 118} 119 120#ifndef UNDER_CE 121AString 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 132UString 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 148AString 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