const CFStringEncoding * CFStringGetListOfAvailableEncodings (void) { if (_kCFStringEncodingList == NULL) { GSMutexLock (&_kCFStringEncodingLock); if (_kCFStringEncodingList == NULL) { int32_t count; int32_t idx; const char *name; UErrorCode err = U_ZERO_ERROR; count = ucnv_countAvailable (); _kCFStringEncodingList = CFAllocatorAllocate (NULL, sizeof(CFStringEncoding) * (count + 1), 0); idx = 0; while (idx < count) { name = ucnv_getStandardName(ucnv_getAvailableName (idx), "MIME", &err); if (U_SUCCESS(err)) _kCFStringEncodingList[idx] = CFStringConvertStandardNameToEncoding (name, -1); ++idx; } _kCFStringEncodingList[idx] = kCFStringEncodingInvalidId; } GSMutexUnlock (&_kCFStringEncodingLock); } return _kCFStringEncodingList; }
CFStringEncoding CFStringGetSystemEncoding (void) { #if defined(_WIN32) return kCFStringEncodingASCII; #else if (_kCFStringSystemEncoding == kCFStringEncodingInvalidId) { GSMutexLock (&_kCFStringEncodingLock); if (_kCFStringSystemEncoding == kCFStringEncodingInvalidId) { const char *name; const char *defaultName; UErrorCode err = U_ZERO_ERROR; defaultName = ucnv_getDefaultName (); name = ucnv_getStandardName (defaultName, "MIME", &err); if (name != NULL) { _kCFStringSystemEncoding = CFStringConvertStandardNameToEncoding (name, -1); } else { name = ucnv_getStandardName (defaultName, "IANA", &err); if (name != NULL) _kCFStringSystemEncoding = CFStringConvertStandardNameToEncoding (name, -1); else _kCFStringSystemEncoding = kCFStringEncodingInvalidId; } } GSMutexUnlock (&_kCFStringEncodingLock); } return _kCFStringSystemEncoding; #endif }
CFStringEncoding CFStringConvertIANACharSetNameToEncoding (CFStringRef str) { /* We'll start out by checking if it's one of the UTF identifiers, than ISO, Windows codepages, DOS codepages and EUC. Will use strncasecmp because the compare here is not case sensitive. */ char buffer[32]; CFIndex length; if (!CFStringGetCString (str, buffer, 32, kCFStringEncodingASCII)) return kCFStringEncodingInvalidId; length = CFStringGetLength (str); return CFStringConvertStandardNameToEncoding (buffer, length); }