2727#include < string>
2828#include < sstream>
2929#include < iomanip>
30- #if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 5
31- #include < boost/locale/encoding_utf.hpp>
32- using boost::locale::conv::utf_to_utf;
33- #define CODECVT_BOOST_FALLBACK
34- #else
3530#include < codecvt>
36- #endif
3731
3832#include " ../ifcparse/IfcCharacterDecoder.h"
3933#include " ../ifcparse/IfcException.h"
@@ -318,7 +312,7 @@ IfcCharacterDecoder::ConversionMode IfcCharacterDecoder::mode = IfcCharacterDeco
318312char IfcCharacterDecoder::substitution_character = ' _' ;
319313
320314IfcCharacterEncoder::IfcCharacterEncoder (const std::string& input)
321- : str(IfcUtil::convert_utf8 (input)) {}
315+ : str(IfcUtil::convert_utf8_to_utf32 (input)) {}
322316
323317IfcCharacterEncoder::operator std::string () {
324318 std::ostringstream oss;
@@ -401,21 +395,27 @@ std::wstring::value_type IfcUtil::convert_codepage(int codepage, int c) {
401395 return r;
402396}
403397
404- #ifdef CODECVT_BOOST_FALLBACK
405- std::string IfcUtil::convert_utf8 (const std::wstring& s) {
406- return utf_to_utf<char >(s.c_str (), s.c_str () + s.size ());
407- }
408-
409- std::wstring IfcUtil::convert_utf8 (const std::string& s)
410- {
411- return utf_to_utf<wchar_t >(s.c_str (), s.c_str () + s.size ());
412- }
413- #else
414398std::string IfcUtil::convert_utf8 (const std::wstring& s) {
415399 return std::wstring_convert<std::codecvt_utf8<std::wstring::value_type>>().to_bytes (s);
416400}
417401
418402std::wstring IfcUtil::convert_utf8 (const std::string& s) {
419403 return std::wstring_convert<std::codecvt_utf8<std::wstring::value_type>>().from_bytes (s);
420404}
405+
406+ #ifdef _MSC_VER
407+
408+ // bug in msvc 2015 and 2017, unsure if fixed in later versions
409+
410+ std::u32string IfcUtil::convert_utf8_to_utf32 (const std::string& s) {
411+ auto converted = std::wstring_convert<std::codecvt_utf8<int32_t >, int32_t >().from_bytes (s);
412+ return std::u32string (reinterpret_cast <char32_t const *>(converted.data ()));
413+ }
414+
415+ #else
416+
417+ std::u32string IfcUtil::convert_utf8_to_utf32 (const std::string& s) {
418+ return std::wstring_convert<std::codecvt_utf8<std::u32string::value_type>, std::u32string::value_type>().from_bytes (s);
419+ }
420+
421421#endif
0 commit comments