cog/Frameworks/SSEQPlayer/SSEQPlayer/UtfConverter.cpp

70 lines
3.0 KiB
C++

// original code is from here: http://www.codeproject.com/Articles/17573/Convert-Between-std-string-and-std-wstring-UTF-8-a
// License: The Code Project Open License (CPOL) http://www.codeproject.com/info/cpol10.aspx
#include <string>
#include <vector>
#include <stdexcept>
#include "ConvertUTF.h"
namespace UtfConverter
{
std::wstring FromUtf8(const std::string &utf8string)
{
auto widesize = utf8string.length();
auto result = std::vector<wchar_t>(widesize + 1, L'\0');
auto orig = std::vector<char>(widesize + 1, '\0');
std::copy(utf8string.begin(), utf8string.end(), orig.begin());
auto *sourcestart = reinterpret_cast<const UTF8 *>(&orig[0]), *sourceend = sourcestart + widesize;
ConversionResult res;
if (sizeof(wchar_t) == 2)
{
auto *targetstart = reinterpret_cast<UTF16 *>(&result[0]), *targetend = targetstart + widesize;
res = ConvertUTF8toUTF16(&sourcestart, sourceend, &targetstart, targetend, strictConversion);
*targetstart = 0;
unsigned end = targetstart - reinterpret_cast<UTF16 *>(&result[0]);
result.erase(result.begin() + end, result.end());
}
else if (sizeof(wchar_t) == 4)
{
auto *targetstart = reinterpret_cast<UTF32 *>(&result[0]), *targetend = targetstart + widesize;
res = ConvertUTF8toUTF32(&sourcestart, sourceend, &targetstart, targetend, strictConversion);
*targetstart = 0;
unsigned end = targetstart - reinterpret_cast<UTF32 *>(&result[0]);
result.erase(result.begin() + end, result.end());
}
else
throw std::runtime_error("UtfConverter::FromUtf8: sizeof(wchar_t) is not 2 or 4.");
if (res != conversionOK)
throw std::runtime_error("UtfConverter::FromUtf8: Conversion failed.");
return std::wstring(result.begin(), result.end());
}
std::string ToUtf8(const std::wstring &widestring)
{
auto widesize = widestring.length(), utf8size = (sizeof(wchar_t) == 2 ? 3 : 4) * widesize + 1;
auto result = std::vector<char>(utf8size, '\0');
auto orig = std::vector<wchar_t>(widesize + 1, L'\0');
std::copy(widestring.begin(), widestring.end(), orig.begin());
auto *targetstart = reinterpret_cast<UTF8 *>(&result[0]), *targetend = targetstart + utf8size;
ConversionResult res;
if (sizeof(wchar_t) == 2)
{
auto *sourcestart = reinterpret_cast<const UTF16 *>(&orig[0]), *sourceend = sourcestart + widesize;
res = ConvertUTF16toUTF8(&sourcestart, sourceend, &targetstart, targetend, strictConversion);
}
else if (sizeof(wchar_t) == 4)
{
auto *sourcestart = reinterpret_cast<const UTF32 *>(&orig[0]), *sourceend = sourcestart + widesize;
res = ConvertUTF32toUTF8(&sourcestart, sourceend, &targetstart, targetend, strictConversion);
}
else
throw std::runtime_error("UtfConverter::ToUtf8: sizeof(wchar_t) is not 2 or 4.");
if (res != conversionOK)
throw std::runtime_error("UtfConverter::ToUtf8: Conversion failed.");
*targetstart = 0;
auto end = targetstart - reinterpret_cast<UTF8 *>(&result[0]);
result.erase(result.begin() + end, result.end());
return std::string(result.begin(), result.end());
}
}