diff --git a/src/ifcparse/IfcCharacterDecoder.cpp b/src/ifcparse/IfcCharacterDecoder.cpp index 456136a688..4ccd2ee465 100644 --- a/src/ifcparse/IfcCharacterDecoder.cpp +++ b/src/ifcparse/IfcCharacterDecoder.cpp @@ -27,13 +27,7 @@ #include #include #include -#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 5 -#include -using boost::locale::conv::utf_to_utf; -#define CODECVT_BOOST_FALLBACK -#else #include -#endif #include "../ifcparse/IfcCharacterDecoder.h" #include "../ifcparse/IfcException.h" @@ -318,7 +312,7 @@ IfcCharacterDecoder::ConversionMode IfcCharacterDecoder::mode = IfcCharacterDeco char IfcCharacterDecoder::substitution_character = '_'; IfcCharacterEncoder::IfcCharacterEncoder(const std::string& input) - : str(IfcUtil::convert_utf8(input)) {} + : str(IfcUtil::convert_utf8_to_utf32(input)) {} IfcCharacterEncoder::operator std::string() { std::ostringstream oss; @@ -401,16 +395,6 @@ std::wstring::value_type IfcUtil::convert_codepage(int codepage, int c) { return r; } -#ifdef CODECVT_BOOST_FALLBACK -std::string IfcUtil::convert_utf8(const std::wstring& s) { - return utf_to_utf(s.c_str(), s.c_str() + s.size()); -} - -std::wstring IfcUtil::convert_utf8(const std::string& s) -{ - return utf_to_utf(s.c_str(), s.c_str() + s.size()); -} -#else std::string IfcUtil::convert_utf8(const std::wstring& s) { return std::wstring_convert>().to_bytes(s); } @@ -418,4 +402,20 @@ std::string IfcUtil::convert_utf8(const std::wstring& s) { std::wstring IfcUtil::convert_utf8(const std::string& s) { return std::wstring_convert>().from_bytes(s); } + +#ifdef _MSC_VER + +// bug in msvc 2015 and 2017, unsure if fixed in later versions + +std::u32string IfcUtil::convert_utf8_to_utf32(const std::string& s) { + auto converted = std::wstring_convert, int32_t>().from_bytes(s); + return std::u32string(reinterpret_cast(converted.data())); +} + +#else + +std::u32string IfcUtil::convert_utf8_to_utf32(const std::string& s) { + return std::wstring_convert, std::u32string::value_type>().from_bytes(s); +} + #endif \ No newline at end of file diff --git a/src/ifcparse/IfcCharacterDecoder.h b/src/ifcparse/IfcCharacterDecoder.h index 9aaff758f3..198b2fe9af 100644 --- a/src/ifcparse/IfcCharacterDecoder.h +++ b/src/ifcparse/IfcCharacterDecoder.h @@ -36,6 +36,7 @@ namespace IfcUtil { std::wstring::value_type convert_codepage(int codepage, int c); std::string convert_utf8(const std::wstring& s); std::wstring convert_utf8(const std::string& s); + std::u32string convert_utf8_to_utf32(const std::string& s); } namespace IfcParse { @@ -67,7 +68,7 @@ namespace IfcWrite { class IFC_PARSE_API IfcCharacterEncoder { private: - std::wstring str; + std::u32string str; public: IfcCharacterEncoder(const std::string& input); operator std::string();