use native conversions that are close to the native storage of wxString
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58519 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -608,28 +608,16 @@ wxCFStringRef::wxCFStringRef( const wxString &st , wxFontEncoding WXUNUSED_IN_UN
|
|||||||
wxString str = st ;
|
wxString str = st ;
|
||||||
wxMacConvertNewlines13To10( &str ) ;
|
wxMacConvertNewlines13To10( &str ) ;
|
||||||
#if wxUSE_UNICODE
|
#if wxUSE_UNICODE
|
||||||
#if SIZEOF_WCHAR_T == 2
|
#if wxUSE_UNICODE_WCHAR
|
||||||
reset( CFStringCreateWithCharacters( kCFAllocatorDefault,
|
// native = wchar_t 4 bytes for us
|
||||||
(UniChar*)str.wc_str() , str.Len() ) );
|
reset( CFStringCreateWithBytes( kCFAllocatorDefault,
|
||||||
|
(const UInt8*)str.wc_str() , str.length()*4, kCFStringEncodingUTF32, false /* no BOM */ ) );
|
||||||
|
#elif wxUSE_UNICODE_UTF8
|
||||||
|
// native = utf8
|
||||||
|
reset( CFStringCreateWithBytes( kCFAllocatorDefault,
|
||||||
|
(const UInt8*) str.utf8_str() , str.utf8_length() , kCFStringEncodingUTF8, false /* no BOM */ ) );
|
||||||
#else
|
#else
|
||||||
wxMBConvUTF16 converter ;
|
#error "unsupported unicode representation"
|
||||||
size_t unicharbytes = converter.FromWChar( NULL , 0 , str.wc_str() , str.Length() ) ;
|
|
||||||
wxASSERT( unicharbytes != wxCONV_FAILED );
|
|
||||||
if ( unicharbytes == wxCONV_FAILED )
|
|
||||||
{
|
|
||||||
// create an empty string
|
|
||||||
reset( wxCFRetain( CFSTR("") ) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// unicharbytes: number of bytes needed for UTF-16 encoded string (without terminating null)
|
|
||||||
// unichars: number of UTF-16 characters (without terminating null)
|
|
||||||
size_t unichars = unicharbytes / sizeof(UniChar) ;
|
|
||||||
UniChar *unibuf = new UniChar[ unichars ] ;
|
|
||||||
converter.FromWChar( (char*)unibuf , unicharbytes , str.wc_str() , str.Length() ) ;
|
|
||||||
reset( CFStringCreateWithCharacters( kCFAllocatorDefault , unibuf , unichars ) ) ;
|
|
||||||
delete[] unibuf ;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
#else // not wxUSE_UNICODE
|
#else // not wxUSE_UNICODE
|
||||||
reset( CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() ,
|
reset( CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() ,
|
||||||
@@ -644,38 +632,41 @@ wxString wxCFStringRef::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encoding))
|
|||||||
return wxEmptyString ;
|
return wxEmptyString ;
|
||||||
|
|
||||||
Size cflen = CFStringGetLength( get() ) ;
|
Size cflen = CFStringGetLength( get() ) ;
|
||||||
size_t noChars ;
|
char* buf = NULL ;
|
||||||
wxChar* buf = NULL ;
|
|
||||||
|
CFStringEncoding cfencoding = 0;
|
||||||
|
wxString result;
|
||||||
|
#if wxUSE_UNICODE
|
||||||
|
#if wxUSE_UNICODE_WCHAR
|
||||||
|
cfencoding = kCFStringEncodingUTF32;
|
||||||
|
#elif wxUSE_UNICODE_UTF8
|
||||||
|
cfencoding = kCFStringEncodingUTF8;
|
||||||
|
#else
|
||||||
|
#error "unsupported unicode representation"
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
cfencoding = wxMacGetSystemEncFromFontEnc( encoding );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CFIndex cStrLen ;
|
||||||
|
CFStringGetBytes( get() , CFRangeMake(0, cflen) , cfencoding ,
|
||||||
|
'?' , false , NULL , 0 , &cStrLen ) ;
|
||||||
|
buf = new char[ cStrLen ] ;
|
||||||
|
CFStringGetBytes( get() , CFRangeMake(0, cflen) , cfencoding,
|
||||||
|
'?' , false , (unsigned char*) buf , cStrLen , &cStrLen) ;
|
||||||
|
|
||||||
#if wxUSE_UNICODE
|
#if wxUSE_UNICODE
|
||||||
#if SIZEOF_WCHAR_T == 2
|
#if wxUSE_UNICODE_WCHAR
|
||||||
buf = new wxChar[ cflen + 1 ] ;
|
result = wxString( (const wchar_t*) buf , cStrLen/4);
|
||||||
CFStringGetCharacters( get() , CFRangeMake( 0 , cflen ) , (UniChar*) buf ) ;
|
#elif wxUSE_UNICODE_UTF8
|
||||||
noChars = cflen ;
|
result = wxString::FromUTF8( buf, cStrLen );
|
||||||
|
#else
|
||||||
|
#error "unsupported unicode representation"
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
UniChar* unibuf = new UniChar[ cflen + 1 ] ;
|
wxString result(buf, cStrLen) ;
|
||||||
CFStringGetCharacters( get() , CFRangeMake( 0 , cflen ) , (UniChar*) unibuf ) ;
|
|
||||||
unibuf[cflen] = 0 ;
|
|
||||||
wxMBConvUTF16 converter ;
|
|
||||||
noChars = converter.MB2WC( NULL , (const char*)unibuf , 0 ) ;
|
|
||||||
wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Unable to count the number of characters in this string!") );
|
|
||||||
buf = new wxChar[ noChars + 1 ] ;
|
|
||||||
noChars = converter.MB2WC( buf , (const char*)unibuf , noChars + 1 ) ;
|
|
||||||
wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Conversion of string failed!") );
|
|
||||||
delete[] unibuf ;
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
CFIndex cStrLen ;
|
|
||||||
CFStringGetBytes( get() , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) ,
|
|
||||||
'?' , false , NULL , 0 , &cStrLen ) ;
|
|
||||||
buf = new wxChar[ cStrLen + 1 ] ;
|
|
||||||
CFStringGetBytes( get() , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) ,
|
|
||||||
'?' , false , (unsigned char*) buf , cStrLen , &cStrLen) ;
|
|
||||||
noChars = cStrLen ;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
buf[noChars] = 0 ;
|
|
||||||
wxString result(buf) ;
|
|
||||||
delete[] buf ;
|
delete[] buf ;
|
||||||
wxMacConvertNewlines10To13( &result);
|
wxMacConvertNewlines10To13( &result);
|
||||||
return result ;
|
return result ;
|
||||||
|
Reference in New Issue
Block a user