From 5f5c80bfdd66ec55f9ae0479ed89e5d58c72067a Mon Sep 17 00:00:00 2001 From: Clemens Lang Date: Mon, 16 Apr 2018 23:01:12 +0200 Subject: [PATCH] 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. Upstream-Status: Submitted [https://bugzilla.gnome.org/show_bug.cgi?id=795338] --- glib/glibmm/ustring.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/glib/glibmm/ustring.cc b/glib/glibmm/ustring.cc index 976289f5..901deac4 100644 --- ./glib/glibmm/ustring.cc +++ ./glib/glibmm/ustring.cc @@ -1371,7 +1371,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( @@ -1459,7 +1459,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( @@ -1490,7 +1490,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)); -- 2.17.0