X-Git-Url: https://git.pterodactylus.net/?p=fms.git;a=blobdiff_plain;f=src%2Funicode%2Futfconversion.cpp;h=8d62b8809e06c0156cc8e7c7856cd69e66eff77a;hp=5d7c8357c8efaae5068f6cfde1b139fdb7f728e5;hb=HEAD;hpb=9ae3b1434e51788e6feb72e1415ec800d05c535a diff --git a/src/unicode/utfconversion.cpp b/src/unicode/utfconversion.cpp index 5d7c835..8d62b88 100644 --- a/src/unicode/utfconversion.cpp +++ b/src/unicode/utfconversion.cpp @@ -1,5 +1,9 @@ #include "../../include/unicode/utfconversion.h" +#ifdef _WIN32 +#include "../../include/pstdint.h" +#endif + namespace UTFConversion { @@ -16,7 +20,7 @@ const bool FromUTF8(const std::vector &utf8string, std: const UTF8 *sourcestart=reinterpret_cast(&utf8string[0]); const UTF8 *sourceend=sourcestart+utf8string.size(); - if(sizeof(wchar_t)==2) + if(sizeof(std::wstring::value_type)==2 && sizeof(UTF16)==2) { UTF16 *deststart=reinterpret_cast(&dest[0]); UTF16 *destend=deststart+dest.size(); @@ -31,7 +35,7 @@ const bool FromUTF8(const std::vector &utf8string, std: wcstring.assign(dest.begin(),dest.end()-(destend-deststart)); } - else if(sizeof(wchar_t)==4) + else if(sizeof(std::wstring::value_type)==4 && sizeof(UTF32)==4) { UTF32 *deststart=reinterpret_cast(&dest[0]); UTF32 *destend=deststart+dest.size(); @@ -48,7 +52,19 @@ const bool FromUTF8(const std::vector &utf8string, std: } else { - return false; + std::vector dest2(utf8string.size(),0); + UTF32 *deststart=reinterpret_cast(&dest2[0]); + UTF32 *destend=deststart+dest2.size(); + + ConversionResult rval=ConvertUTF8toUTF32(&sourcestart,sourceend,&deststart,destend,lenientConversion); + + if(rval!=conversionOK) + { + return false; + } + + wcstring.assign(dest2.begin(),dest2.end()-(destend-deststart)); + } return true; @@ -78,8 +94,8 @@ const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string) } std::vector source(wcstring.begin(),wcstring.end()); - - if(sizeof(std::wstring::value_type)==2) + + if(sizeof(std::wstring::value_type)==2 && sizeof(UTF16)==2) { std::vector dest(wcstring.size()*2,0); @@ -99,7 +115,7 @@ const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string) utf8string.assign(dest.begin(),dest.end()-(destend-deststart)); } - else if(sizeof(std::wstring::value_type)==4) + else if(sizeof(std::wstring::value_type)==4 && sizeof(UTF32)==4) { std::vector dest(wcstring.size()*4,0); @@ -121,7 +137,24 @@ const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string) } else { - return false; + std::vector source2(wcstring.begin(),wcstring.end()); + std::vector dest(wcstring.size()*sizeof(std::wstring::value_type),0); + + const UTF32 *sourcestart=reinterpret_cast(&source2[0]); + const UTF32 *sourceend=sourcestart+source2.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)); + } return true;