blob: 825b16f09e1e8b41f21a77eb85e923f093ed9ee9 [file] [log] [blame]
// Common/StringConvert.cpp
#include "StdAfx.h"
#include "StringConvert.h"
#ifndef _WIN32
#include <stdlib.h>
#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