mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 21:14:58 -06:00
166 lines
4.2 KiB
C++
166 lines
4.2 KiB
C++
// 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
|