// Common/StringConvert.cpp #include "StdAfx.h" #include "StringConvert.h" #ifndef _WIN32 #include #endif #ifdef _WIN32 UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) { UString resultString; if (!srcString.IsEmpty()) { int numChars = MultiByteToWideChar(codePage, 0, srcString, srcString.Len(), resultString.GetBuffer(srcString.Len()), srcString.Len() + 1); if (numChars == 0) throw 282228; resultString.ReleaseBuffer(numChars); } return resultString; } void MultiByteToUnicodeString2(UString &dest, const AString &srcString, UINT codePage) { dest.Empty(); if (!srcString.IsEmpty()) { wchar_t *destBuf = dest.GetBuffer(srcString.Len()); const char *sp = (const char *)srcString; unsigned i; for (i = 0;;) { char c = sp[i]; if ((Byte)c >= 0x80 || c == 0) break; destBuf[i++] = (wchar_t)c; } if (i != srcString.Len()) { unsigned numChars = MultiByteToWideChar(codePage, 0, sp + i, srcString.Len() - i, destBuf + i, srcString.Len() + 1 - i); if (numChars == 0) throw 282228; i += numChars; } dest.ReleaseBuffer(i); } } void UnicodeStringToMultiByte2(AString &dest, const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed) { dest.Empty(); defaultCharWasUsed = false; if (!s.IsEmpty()) { unsigned numRequiredBytes = s.Len() * 2; char *destBuf = dest.GetBuffer(numRequiredBytes); unsigned i; const wchar_t *sp = (const wchar_t *)s; for (i = 0;;) { wchar_t c = sp[i]; if (c >= 0x80 || c == 0) break; destBuf[i++] = (char)c; } defaultCharWasUsed = false; if (i != s.Len()) { BOOL defUsed; unsigned numChars = WideCharToMultiByte(codePage, 0, sp + i, s.Len() - i, destBuf + i, numRequiredBytes + 1 - i, &defaultChar, &defUsed); defaultCharWasUsed = (defUsed != FALSE); if (numChars == 0) throw 282229; i += numChars; } dest.ReleaseBuffer(i); } } void UnicodeStringToMultiByte2(AString &dest, const UString &srcString, UINT codePage) { bool defaultCharWasUsed; UnicodeStringToMultiByte2(dest, srcString, codePage, '_', defaultCharWasUsed); } AString UnicodeStringToMultiByte(const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed) { AString dest; defaultCharWasUsed = false; if (!s.IsEmpty()) { unsigned numRequiredBytes = s.Len() * 2; BOOL defUsed; int numChars = WideCharToMultiByte(codePage, 0, s, s.Len(), dest.GetBuffer(numRequiredBytes), numRequiredBytes + 1, &defaultChar, &defUsed); defaultCharWasUsed = (defUsed != FALSE); if (numChars == 0) throw 282229; dest.ReleaseBuffer(numChars); } return dest; } AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) { bool defaultCharWasUsed; return UnicodeStringToMultiByte(srcString, codePage, '_', defaultCharWasUsed); } #ifndef UNDER_CE AString SystemStringToOemString(const CSysString &srcString) { AString result; CharToOem(srcString, result.GetBuffer(srcString.Len() * 2)); result.ReleaseBuffer(); return result; } #endif #else UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) { UString resultString; for (unsigned i = 0; i < srcString.Len(); i++) resultString += (wchar_t)srcString[i]; /* if (!srcString.IsEmpty()) { int numChars = mbstowcs(resultString.GetBuffer(srcString.Len()), srcString, srcString.Len() + 1); if (numChars < 0) throw "Your environment does not support UNICODE"; resultString.ReleaseBuffer(numChars); } */ return resultString; } AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) { AString resultString; for (unsigned i = 0; i < srcString.Len(); i++) resultString += (char)srcString[i]; /* if (!srcString.IsEmpty()) { int numRequiredBytes = srcString.Len() * 6 + 1; int numChars = wcstombs(resultString.GetBuffer(numRequiredBytes), srcString, numRequiredBytes); if (numChars < 0) throw "Your environment does not support UNICODE"; resultString.ReleaseBuffer(numChars); } */ return resultString; } #endif