Преобразование между строковыми кодировками

Строковые объекты дают Вам много инструментов для преобразования между строковыми кодировками. Некоторые подпрограммы делают фактические преобразования, в то время как другие показывают, какие кодировки доступны и помогают, Вы выбрали лучшее кодирование для текущей ситуации.

Если Вы хотите преобразовать между какими-либо двумя кодировками не-Unicode, можно использовать a CFString возразите как посредник. Скажите, что Вам закодировали строку Windows Latin 1, и Вы хотите закодировать его римлянином Mac OS. Просто преобразуйте строку в Unicode сначала ( CFString объект), затем преобразуйте содержание строки в желаемое кодирование.

Многие из создания и получающих доступ к содержанию функций, описанных в более ранних разделах этого документа, включают введенный параметр кодирования CFStringEncoding. Эти функции перечислены в Таблице 1. Указать кодирование источника или целевой строки (в зависимости от того, создаете ли Вы a CFString объект или доступ к его содержанию), укажите enum значение для желаемого кодирования в этом параметре, когда Вы вызываете одну из этих функций. Используйте CFStringIsEncodingAvailable функционируйте для тестирования на доступность «внешнего» кодирования в системе перед вызовом функции преобразования.

Табличные 1  Функции преобразования кодирования

Преобразовывает в CFString (Unicode)

CFStringCreateWithCString

CFStringCreateWithCStringNoCopy

CFStringCreateWithBytes

CFStringCreateFromExternalRepresentation

Преобразовывает из CFString (Unicode)

CFStringGetCString

CFStringGetCStringPtr

CFStringGetBytes

CFStringCreateExternalRepresentation

Слово предостережения: не все преобразования, как гарантируют, будут успешны. При попытке преобразовать a, это - особенно истина CFString объект с символами, отображающимися на множество наборов символов. Например, скажем, у Вас есть строка Unicode, включающая символы ASCII и акцентировавшая латинские символы. Вы могли преобразовать эту строку в римлянина Mac OS, но не японцу Mac OS. В этих случаях можно указать преобразование «с потерями» с помощью CFStringGetBytes функция; этот вид преобразования заменяет символом «потерь» каждый символ, который не может быть преобразован. CFStringGetBytes функция описана в следующем разделе

Основные подпрограммы преобразования

Среди строковых функций объекта, преобразовывающих кодировки символов в CFString объекты являются двумя низкоуровневыми функциями преобразования, CFStringGetBytes и CFStringCreateWithBytes. Как их имена предполагают, эти функции воздействуют на буферы байта известного размера. В дополнение к выполнению преобразований кодирования они также обрабатывают любые специальные символы в строке (такие как BOM), который делает строку подходящей для внешнего представления.

Однако CFStringGetBytes функция особенно полезна для кодирования преобразований, потому что это позволяет спецификацию байта потерь. Если Вы указываете символ для байта потерь, функциональные замены, что символ, когда это не может преобразовать значение Unicode в надлежащий символ. Если Вы указываете 0 для байта потерь, это “преобразование с потерями” не позволяется, и функция возвращает (косвенно) частичный набор символов, когда это встречается с первым символом, это не может преобразовать. Все другие получающие доступ к содержанию функции CFString запретите преобразование с потерями.

Перечисление 1 иллюстрирует как CFStringGetBytes мог бы использоваться для преобразования строки от системного кодирования до Windows Latin 1. Отметьте одну другую функцию функции: это позволяет, Вы для преобразования строки в фиксированный размер буферизуете один сегмент за один раз.

  Преобразование перечисления 1 в различное кодирование с CFStringGetBytes

CFStringRef str;
CFRange rangeToProcess;
 
str = CFStringCreateWithCString(NULL, "Hello World", kCFStringEncodingMacRoman);
 
rangeToProcess = CFRangeMake(0, CFStringGetLength(str));
while (rangeToProcess.length > 0) {
    UInt8 localBuffer[100];
    CFIndex usedBufferLength;
    CFIndex numChars = CFStringGetBytes(str, rangeToProcess, kCFStringEncodingWindowsLatin1, '?', FALSE, (UInt8 *)localBuffer, 100, &usedBufferLength);
    if (numChars == 0) break;   // Failed to convert anything...
    processCharacters(localBuffer, usedBufferLength);
    rangeToProcess.location += numChars;
    rangeToProcess.length -= numChars;
}

Если размер строки для преобразования является относительно маленьким, можно проявить другой подход с CFStringGetBytes функция. С буферным набором параметра к NULL можно вызвать функцию для обнаружения двух вещей. Если функциональный результат больше, чем 0 преобразований возможны. И, если преобразование будет возможно, то последний параметр (usedBufLen) будет содержать число байтов, требуемых для преобразования. С этой информацией можно выделить буфер необходимого размера и преобразовать строку в одном выстреле в желаемое кодирование. Однако, если строка является большой, этот метод имеет свои недостатки; выяснение длины могло быть дорогим, и выделение могло потребовать большого количества памяти.

Утилиты преобразования кодирования

Помимо функций, преобразовывающих между кодировками, представьте предложение объектов в виде строки много функций, которые могут помочь Вам узнать, какие кодировки доступны и их, которые являются лучшими для использования в коде.

Кодирование характеристикой

CFStringGetSmallestEncoding функция определяет самое маленькое кодирование, которое может использоваться в определенной системе (самый маленький с точки зрения байтов, должен был представлять один символ). CFStringGetFastestEncoding функция получает кодирование на существующей системе с самым быстрым временем преобразования от Unicode. CFStringGetSystemEncoding функция получает кодирование, используемое строками, сгенерированными операционной системой.

Доступные кодировки

Используйте CFStringIsEncodingAvailable и CFStringGetListOfAvailableEncodings функции для получения информации о кодировках, доступных в системе.

Отображения к кодированию наборов

Можно использовать CFStringConvertEncodingToWindowsCodepage и CFStringConvertWindowsCodepageToEncoding функции для преобразования между номерами кодовых страниц Windows и CFStringEncoding значения. Подобные наборы функций существуют для Какао NSString кодирование констант и идентификаторов «набора символов» IANA, используемых кодировками MIME.

Поддерживаемые кодировки

Базовые строковые объекты Основы поддерживают преобразования между кодировками Unicode объектов CFString и широким диапазоном международных, национальных, и отраслевыми кодировками. Поддерживаемые кодировки прибывают в два набора, «внутренний» набор, определенный в CFString.h CFStringBuiltInEncodingsenum, и «внешний» набор, определенный в CFStringEncodingExt.h CFStringEncodingsenum. Кодировки во внутреннем наборе, как гарантируют, будут доступны на всех платформах для преобразований в и от объектов CFString. Встроенные кодировки (как определяется постоянными именами в CFStringBuiltInEncodings) включайте:

Преобразования с помощью кодировок во внешнем наборе возможны, только если базовая система поддерживает кодировки.