X-Git-Url: https://git.pterodactylus.net/?p=fms.git;a=blobdiff_plain;f=src%2Funicode%2Futfconversion.cpp;fp=src%2Funicode%2Futfconversion.cpp;h=112ed17db6321658811139db34172512cbdca940;hp=0000000000000000000000000000000000000000;hb=56f67ecca96efc7b72d03c95c8c42cfb66e31468;hpb=f2545574af789b63fc655decfe31a3d9f1b30504 diff --git a/src/unicode/utfconversion.cpp b/src/unicode/utfconversion.cpp new file mode 100644 index 0000000..112ed17 --- /dev/null +++ b/src/unicode/utfconversion.cpp @@ -0,0 +1,122 @@ +#include "../../include/unicode/utfconversion.h" + +namespace UTFConversion +{ + +const bool FromUTF8(const std::vector &utf8string, std::wstring &wcstring) +{ + if(utf8string.size()==0) + { + wcstring.assign(L""); + return true; + } + + std::vector dest(utf8string.size(),0); // dest will never be bigger than the input but could be smaller + + const UTF8 *sourcestart=reinterpret_cast(&utf8string[0]); + const UTF8 *sourceend=sourcestart+utf8string.size(); + + if(sizeof(wchar_t)==2) + { + UTF16 *deststart=reinterpret_cast(&dest[0]); + UTF16 *destend=deststart+dest.size(); + + ConversionResult rval=ConvertUTF8toUTF16(&sourcestart,sourceend,&deststart,destend,lenientConversion); + + if(rval!=conversionOK) + { + return false; + } + + wcstring.assign(dest.begin(),dest.end()-(destend-deststart)); + + } + else if(sizeof(wchar_t)==4) + { + UTF32 *deststart=reinterpret_cast(&dest[0]); + UTF32 *destend=deststart+dest.size(); + + ConversionResult rval=ConvertUTF8toUTF32(&sourcestart,sourceend,&deststart,destend,lenientConversion); + + if(rval!=conversionOK) + { + return false; + } + + wcstring.assign(dest.begin(),dest.end()-(destend-deststart)); + + } + else + { + return false; + } + + return true; +} + +const bool FromUTF8(const std::string &utf8string, std::wstring &wcstring) +{ + + return FromUTF8(std::vector(utf8string.begin(),utf8string.end()),wcstring); + +} + +const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string) +{ + if(wcstring.size()==0) + { + utf8string.assign(""); + return true; + } + + std::vector source(wcstring.begin(),wcstring.end()); + + if(sizeof(wchar_t)==2) + { + std::vector dest(wcstring.size()*2,0); + + const UTF16 *sourcestart=reinterpret_cast(&source[0]); + const UTF16 *sourceend=sourcestart+source.size(); + + UTF8 *deststart=reinterpret_cast(&dest[0]); + UTF8 *destend=deststart+dest.size(); + + ConversionResult rval=ConvertUTF16toUTF8(&sourcestart,sourceend,&deststart,destend,lenientConversion); + + if(rval!=conversionOK) + { + return false; + } + + utf8string.assign(dest.begin(),dest.end()-(destend-deststart)); + + } + else if(sizeof(wchar_t)==4) + { + std::vector dest(wcstring.size()*4,0); + + const UTF32 *sourcestart=reinterpret_cast(&source[0]); + const UTF32 *sourceend=sourcestart+source.size(); + + UTF8 *deststart=reinterpret_cast(&dest[0]); + UTF8 *destend=deststart+dest.size(); + + ConversionResult rval=ConvertUTF32toUTF8(&sourcestart,sourceend,&deststart,destend,lenientConversion); + + if(rval!=conversionOK) + { + return false; + } + + utf8string.assign(dest.begin(),dest.end()-(destend-deststart)); + + } + else + { + return false; + } + + return true; +} + +} // namespace