Обработка внешних представлений строк

Внешнее представление объекта CFString в Базовой Основе является строковыми данными в форме, которая может быть записана в диск и считана, въезжают задним ходом на той же платформе или на различной платформе. Формат внешне представленного объекта CFString является объектом CFData. Если кодирование символов является Unicode, данные обычно включают специальный символ, названный BOM (для “метки порядка байтов”), который определяет порядок байтов данных. Когда внешнее представление строки читается, Базовая Основа оценивает BOM и делает любой необходимый свопинг байта. Если кодирование является Unicode и нет никакого BOM, данные, как предполагается, являются обратным порядком байтов. При использовании строковых объектов выписать внешнее представление символов Unicode BOM вставляется, за исключением представлений, создаваемых с кодированием констант kCFStringEncodingUTF16BE, kCFStringEncodingUTF16LE, kCFStringEncodingUTF32BE, и kCFStringEncodingUTF32LE. Эти кодировки не требуют BOM, потому что порядок байтов явно обозначен буквами «BE» (обратный порядок байтов) и «LE» (прямой порядок байтов).

Когда Вы хотите символьные данные, представленные объектом CFString сохраниться, или как файл на диске или как данные, отправленные по сети, необходимо сначала преобразовать объект CFString в объект CFData использование функции CFStringCreateExternalRepresentation. Объект CFData вызывают “внешним представлением” объекта CFString; если кодирование является Unicode, функция автоматически вставляет BOM (маркер порядка байтов) в данных для указания порядка байтов. Можно преобразовать внешнее представление объект CFData назад к объекту CFString с CFStringCreateFromExternalRepresentation функция.

Перечисление 1 показывает, как могли бы использоваться функции внешнего представления. Последний параметр CFStringCreateExternalRepresentation функция указывает байт потерь, значение, которое будет присвоено символам, которые не могут быть преобразованы в указанное кодирование. Если байт потерь 0 (как в примере ниже), и ошибки преобразования происходят, результат функции NULL. Эта функция подобна предоставленному CFStringGetBytes функция; однако, CFStringCreateExternalRepresentation функция более удобна, так как она дает Вам объект CFData.

Перечисление 1  Используя функции внешнего представления

CFDataRef appendTimeToLog(CFDataRef log) {
    CFMutableStringRef mstr;
    CFStringRef str;
    CFDataRef newLog;
    CFGregorianDate date =
        CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeGetCurrent(),
            CFTimeZoneCopySystem());
 
    str = CFStringCreateFromExternalRepresentation(NULL, log,
            kCFStringEncodingUTF8);
    CFShow(str);
    mstr = CFStringCreateMutableCopy(NULL, 0, str);
    CFStringAppendFormat(mstr, NULL,
        CFSTR("Received at %d/%d/%d %.2d:%.2d:%2.0f\n"),
        date.month, date.day, date.year, date.hour, date.minute,
        date.second);
    CFShow(mstr);
    newLog = CFStringCreateExternalRepresentation(NULL, mstr,
        kCFStringEncodingUTF8, '?');
    CFRelease(str);
    CFRelease(mstr);
    CFShow(newLog);
    return newLog;
}

Этот код генерирует вывод, подобный следующему отрывку:

Master Log
 
Master Log
 
Received at 7/20/1999 19:23:16
 
<CFData 0x103c0 [0x69bce158]>{length = 43, capacity = 43, bytes = 0x4d6173746572204c6f670a0a52656365 ... 393a32333a31360a}

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

Вместо того, чтобы использовать CFStringCreateFromExternalRepresentation функция, чтобы создать CFString возражает и затем получить доступ к символам в объекте, можно использовать функции CFData для достигания символов непосредственно. Перечисление 3 показывает, как это сделано с помощью функций CFData CFDataGetLength и CFDataGetBytePtr.