Доступ к содержанию строковых объектов
Два существенных свойства объектов CFString являются массивом символов Unicode и количеством тех символов. Несколько функций CFString не только получают те свойства, особенно символы, но и выполняют преобразования в почти любой нужный формат.
CFStringGetBytes
функция, копирующая содержание объекта CFString в предоставленный клиентами буфер байта, описана в Основных Подпрограммах преобразования. Это описано там вместо в этом разделе, потому что это имеет функции, делающие его особенно подходящим для кодирования преобразований.
Получение содержания как струна до
Вы, возможно, должны использовать интерфейсы программирования, требующие струн до для некоторых их параметров. По причинам производительности общей стратегии доступа к содержанию Кфстрингса, поскольку струна до должна сначала попытаться получить указатель надлежащего типа к этим строкам и, если это перестало работать, для копирования содержания в локальный буфер. Перечисление 1 иллюстрирует эту стратегию струн до с помощью CFStringGetCStringPtr
и CFStringGetCString
функции.
Перечисление 1 , Получающее доступ к содержанию CFString как струна до
CFStringRef str; |
CFRange rangeToProcess; |
const char *bytes; |
str = CFStringCreateWithCString(NULL, "Hello World!", kCFStringEncodingMacRoman); |
bytes = CFStringGetCStringPtr(str, kCFStringEncodingMacRoman); |
if (bytes == NULL) { |
char localBuffer[10]; |
Boolean success; |
success = CFStringGetCString(str, localBuffer, 10, kCFStringEncodingMacRoman); |
} |
Эти функции позволяют Вам указывать кодирование, в которое должны быть преобразованы символы Unicode. Функции, заканчивающиеся «Ptr» или возвращающие желаемый указатель быстро в постоянное время, или они возвращаются NULL
. Если последний имеет место, необходимо использовать CFStringGetCString
.
Буфер для CFStringGetCString
функции могут или быть на штабеле или части выделенной памяти. Эти функции все еще могли бы не получить символы, но который только происходит при двух обстоятельствах: преобразование из UniChar
содержание CFString к указанным сбоям кодирования или буферу является слишком маленьким. При необходимости в копии символьного буфера или если рассматриваемый код не настолько чувствителен к производительности, Вы могли бы просто вызвать CFStringGetCString
функция, даже не пытаясь получить указатель сначала.
Получение содержания как строки Unicode
Строковые объекты предлагают пару функций, подобных тем для струн до для доступа к содержанию CFString как 16-разрядный буфер Unicode: CFStringGetCharactersPtr
и CFStringGetCharacters
. Типичное использование этих функций также идентично: Вы сначала дополнительно пытаетесь получить указатель на символы и, если это перестало работать, Вы пытаетесь скопировать символы в буфер, который Вы обеспечиваете. Эти функции отличаются, однако, в этом они требуют параметра, указывающего длину строки.
Перечисление 2 иллюстрирует общую стратегию использования этих функций.
Перечисление 2 , Получающее доступ к содержанию CFString как символы Unicode
CFStringRef str; |
const UniChar *chars; |
str = CFStringCreateWithCString(NULL, "Hello World", kCFStringEncodingMacRoman); |
chars = CFStringGetCharactersPtr(str); |
if (chars == NULL) { |
CFIndex length = CFStringGetLength(str); |
UniChar *buffer = malloc(length * sizeof(UniChar)); |
CFStringGetCharacters(str, CFRangeMake(0, length), buffer); |
// Process the characters... |
free(buffer); |
} |
Этот пример показывает выделенный буфер (malloc
) вместо буфера штабеля. Можно использовать один или другой. Поскольку необходимо знать размер буфера для CFStringGetCharacters
функцию, выделяя память проще сделать, но менее эффективна. При выделении памяти для символов, необходимо, конечно, освободить буфер, когда Вам больше не нужен он.
Символьная обработка
Иногда Вы могли бы хотеть получить содержание CFString не как весь блок символов, но одного символа Unicode за один раз. Возможно, Вы могли бы искать определенный символ или последовательность символов, таких как специальные управляющие символы, указывающие запуск и конец «записи». Строковые объекты дают Вам три способа обработать символы Unicode.
Первый путь состоит в том, чтобы использовать CFStringGetCharacters
функция, описанная в Том, чтобы заставлять Содержание как Строки Unicode скопировать символы в локальный буфер и затем цикл через символы в буфере. Если большое количество символов включается, но этот метод может быть дорог мудрый памятью, особенно.
Второй способ получить доступ к символам по одному состоит в том, чтобы использовать CFStringGetCharacterAtIndex
функция, поскольку Перечисление 3 иллюстрирует.
Перечисление 3 , Получающее символ за один раз
CFIndex length, i; |
UniChar uchar; |
CFStringRef str; |
str = CFStringCreateWithCString(NULL, "Hello World", kCFStringEncodingMacRoman); |
length = CFStringGetLength(str); |
for (i=0; i < length; i++) { |
uchar = CFStringGetCharacterAtIndex(str, i); |
// Process character.... |
} |
Несмотря на то, что эта функция не требует, чтобы большой блок памяти для содержания блока символов, с помощью нее в цикле мог быть неэффективным. Для таких случаев используйте CFStringGetCharacters
функция вместо этого.
Третий метод для символьной обработки, иллюстрируемой Перечислением 4, комбинирует удобство по одному символьного доступа с эффективностью объемного доступа. Подставляемые функции CFStringInitInlineBuffer
и CFStringGetCharacterFromInlineBuffer
предоставьте доступ к содержанию строки при выполнении обработки последовательного символа. Для использования этого интерфейса программирования вызовите CFStringInitInlineBuffer
функция с a CFStringInlineBuffer
структура (на штабеле, обычно) и диапазон символов CFSTRING. Тогда вызовите CFStringGetCharacterFromInlineBuffer
так много раз, как Вы хотите использовать индекс в тот диапазон относительно запуска диапазона. Поскольку это подставляемые функции, они получают доступ к объекту CFString только периодически для заполнения встроенного буфера.
Символы Listing 4 Processing во встроенном буфере
CFStringRef str; |
CFStringInlineBuffer inlineBuffer;CFIndex length;CFIndex cnt; |
str = CFStringCreateWithCString(NULL, "Hello World", kCFStringEncodingMacRoman); |
length = CFStringGetLength(str) |
CFStringInitInlineBuffer(str, &inlineBuffer, CFRangeMake(0, length)); |
for (cnt = 0; cnt < length; cnt++) { |
UniChar ch = CFStringGetCharacterFromInlineBuffer(&inlineBuffer, cnt); |
// Process character... |
} |