diff options
author | Clemens Lang <cal@macports.org> | 2018-04-26 15:22:43 +0200 |
---|---|---|
committer | Kjell Ahlstedt <kjellahlstedt@gmail.com> | 2018-04-26 15:22:43 +0200 |
commit | f1530eca20452c0ce4f9086b033e0bd85c088de7 (patch) | |
tree | b73b80ff84a5aa1836684af5206715abfbd57604 | |
parent | 8236b0f457e6ede0511f5e197017baa31eb953b4 (diff) | |
download | glibmm-f1530eca20452c0ce4f9086b033e0bd85c088de7.tar.gz |
ustring: Fix wchar conversion on macOS with libc++
libc++ internally represents std::wstrings in UCS-4 just like libstdc++,
but does not set the __STDC_ISO_10646__ define. This caused the code to
fall back to calling iconv with the WCHAR_T source character set, which
does not correctly convert these strings and leads to errors, for
example in inkscape on startup.
See https://trac.macports.org/ticket/56214 for an instance of such
a problem.
Re-use the UCS4 to UTF8 conversion code when libc++ is detected, which
solves this. Bug 795338
-rw-r--r-- | glib/glibmm/ustring.cc | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/glib/glibmm/ustring.cc b/glib/glibmm/ustring.cc index c9895fb5..abd1b580 100644 --- a/glib/glibmm/ustring.cc +++ b/glib/glibmm/ustring.cc @@ -1364,7 +1364,7 @@ ustring::FormatStream::to_string() const #ifdef GLIBMM_HAVE_WIDE_STREAM const std::wstring str = stream_.str(); -#if defined(__STDC_ISO_10646__) && SIZEOF_WCHAR_T == 4 +#if (defined(__STDC_ISO_10646__) || defined(_LIBCPP_VERSION)) && SIZEOF_WCHAR_T == 4 // Avoid going through iconv if wchar_t always contains UCS-4. glong n_bytes = 0; const auto buf = make_unique_ptr_gfree(g_ucs4_to_utf8( @@ -1452,7 +1452,7 @@ operator>>(std::wistream& is, ustring& utf8_string) std::wstring wstr; is >> wstr; -#if defined(__STDC_ISO_10646__) && SIZEOF_WCHAR_T == 4 +#if (defined(__STDC_ISO_10646__) || defined(_LIBCPP_VERSION)) && SIZEOF_WCHAR_T == 4 // Avoid going through iconv if wchar_t always contains UCS-4. glong n_bytes = 0; const auto buf = make_unique_ptr_gfree(g_ucs4_to_utf8( @@ -1483,7 +1483,7 @@ operator<<(std::wostream& os, const ustring& utf8_string) { GError* error = nullptr; -#if defined(__STDC_ISO_10646__) && SIZEOF_WCHAR_T == 4 +#if (defined(__STDC_ISO_10646__) || defined(_LIBCPP_VERSION)) && SIZEOF_WCHAR_T == 4 // Avoid going through iconv if wchar_t always contains UCS-4. const auto buf = make_unique_ptr_gfree( g_utf8_to_ucs4(utf8_string.raw().data(), utf8_string.raw().size(), nullptr, nullptr, &error)); |