]> git.saurik.com Git - wxWidgets.git/commitdiff
Ensure that strings returned by wxMBConv_cf are in NFC form.
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 5 Nov 2010 21:40:09 +0000 (21:40 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 5 Nov 2010 21:40:09 +0000 (21:40 +0000)
Normalize all Unicode strings used internally even though the Darwin kernel
gives them to us in decomposed (NFD) form.

Closes #11730.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66033 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/strconv.cpp
src/osx/core/strconv_cf.cpp

index fb90c2b03b5fb261b3dcaec87f6503610facbdb1..d442253f35c2eaf6c3b5be53ad1ce578107f1031 100644 (file)
@@ -3443,8 +3443,9 @@ WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvCurrent = wxGet_wxConvLibcPtr();
 WXDLLIMPEXP_DATA_BASE(wxMBConv *) wxConvUI = wxGet_wxConvLocalPtr();
 
 #ifdef __DARWIN__
-// The xnu kernel always communicates file paths in decomposed UTF-8.
-// WARNING: Are we sure that CFString's conversion will cause decomposition?
+// It is important to use this conversion object under Darwin as it ensures
+// that Unicode strings are (re)composed correctly even though xnu kernel uses
+// decomposed form internally (at least for the file names).
 static wxMBConv_cf wxConvMacUTF8DObj(wxFONTENCODING_UTF8);
 #endif
 
index c77825c23ac77f56008b2239b8ba84e57901234e..5f37413386c2d40050c6f1adc991b07aaa9bd9e0 100644 (file)
@@ -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<CFMutableStringRef>
+            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