X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dc2575bad4f220ecab4d7ee2ffb44778a8381126..58ce18f2fdadecffb21e27555115af708325cf18:/src/osx/core/strconv_cf.cpp diff --git a/src/osx/core/strconv_cf.cpp b/src/osx/core/strconv_cf.cpp index aba2402411..5f37413386 100644 --- a/src/osx/core/strconv_cf.cpp +++ b/src/osx/core/strconv_cf.cpp @@ -90,6 +90,14 @@ WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_cf(wxFontEncoding encoding) if ( theString == NULL ) return wxCONV_FAILED; + // Ensure that the string is in canonical composed form (NFC): this is + // important because Darwin uses decomposed form (NFD) for e.g. file + // names but we want to use NFC internally. + wxCFRef + cfMutableString(CFStringCreateMutableCopy(NULL, 0, theString)); + CFStringNormalize(cfMutableString, kCFStringNormalizationFormC); + theString = cfMutableString; + /* NOTE: The string content includes the NULL element if the source string did * That means we have to do nothing special because the destination will have * the NULL element iff the source did and the NULL element will be included @@ -212,13 +220,15 @@ WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_cf(wxFontEncoding encoding) m_encoding, 0, // FAIL on unconvertible characters false, // not an external representation - // if dstSize is 0 then pass NULL to get required length in usedBufLen - (dstSize != 0)?(UInt8*)dst:NULL, + (UInt8*)dst, dstSize, &usedBufLen ); - if(charsConverted < CFStringGetLength(theString) ) + // when dst is non-NULL, we check usedBufLen against dstSize as + // CFStringGetBytes sometimes treats dst as being NULL when dstSize==0 + if( (charsConverted < CFStringGetLength(theString)) || + (dst && (size_t) usedBufLen > dstSize) ) return wxCONV_FAILED; return usedBufLen;