Skip to content

Commit 64ff046

Browse files
committed
#2482 Use u32string for character encoder, remove CODECVT_BOOST_FALLBACK
1 parent 16582cf commit 64ff046

2 files changed

Lines changed: 19 additions & 18 deletions

File tree

src/ifcparse/IfcCharacterDecoder.cpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,7 @@
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
318312
char IfcCharacterDecoder::substitution_character = '_';
319313

320314
IfcCharacterEncoder::IfcCharacterEncoder(const std::string& input)
321-
: str(IfcUtil::convert_utf8(input)) {}
315+
: str(IfcUtil::convert_utf8_to_utf32(input)) {}
322316

323317
IfcCharacterEncoder::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
414398
std::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

418402
std::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

src/ifcparse/IfcCharacterDecoder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ namespace IfcUtil {
3636
std::wstring::value_type convert_codepage(int codepage, int c);
3737
std::string convert_utf8(const std::wstring& s);
3838
std::wstring convert_utf8(const std::string& s);
39+
std::u32string convert_utf8_to_utf32(const std::string& s);
3940
}
4041

4142
namespace IfcParse {
@@ -67,7 +68,7 @@ namespace IfcWrite {
6768

6869
class IFC_PARSE_API IfcCharacterEncoder {
6970
private:
70-
std::wstring str;
71+
std::u32string str;
7172
public:
7273
IfcCharacterEncoder(const std::string& input);
7374
operator std::string();

0 commit comments

Comments
 (0)