访问字符串对象的内容(Accessing the Content of String Objects)CFString
2013-08-31 14:45
585 查看
CFString对象两个本质的属性是一个Unicode字符数组和数组中字符的数量。一些CFString函数不仅获取这些属性,特别是字符,去有效装换到各种需要的格式。
CFStringGetBytes函数,复制一个CFString对象的内容到一个客户端提供的字节缓冲区,在“基本转换例程”描述。它之所以在另外的章节中描述,它拥有特别适合编码转换的功能。
像C字符串一样获取内容
你可能使用一些需要C字符串参数的编程接口。由于性能原因,访问CFString内容的策略和一个常用C字符串访问一样,首先获取这个字符串适当类型的指针,如果失败了,复制内容到本地缓冲区中,
列表1 像一个C字符串一样访问CFString内容
CFStringRef str;
CFRange rangToProcess;
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函数缓冲区或者在栈区或者在一块分配的内存中。这些函数取得字符时可能会失败,但是这种情况仅出以下两种情形中:CFString从Unicode内容转换到指定的编码失败或者缓冲区太小了。如果你需要一个字符缓冲区副本,或者不关注代码的性能,你可以简单的调用CFStringGetCString函数,而不去尝试取得指针。
像Unicode字符创一样获取内容
字符创对象提供一对类似使用16位编码缓冲区C字符串访问CFString函数。CFStringGetCharactersPrt和CFStringGetCharacters。这些函数的主要使用方法是相同的;你可以首先尝试去获取指向字符的指针,如果失败,你尝试去拷贝字符到提供的缓冲区中。这些函数是不同的,然而,他们需要一个参数,指定字符串的长度。
列表2 阐述了这些函数常用的用法
列表2 像Unicode字符一样访问CFString内容
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);
free(buffer);
}
这个例子描述了一个分配缓冲区(malloc),而不是栈区。你可以选择使用。因为你使用CFStringGetCharacters函数需要知道缓冲区的大小,分配内存较容易实现但是不高效。如果你为字符分配内存,当然,你必须释放缓冲区当你不在使用的时候。
字符处理
一些情况下你可能需要接收CFString的内容,不是整个字符块,而是一次接收一个Unicode字符。或许你可能寻找个别字符或字符序列,例如特别的控制字符去表明“recode”的开始和结束。字符串对象给你三种途径去处理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);
printf("%c",uchar);
}
尽管这个函数不会为一块字符而要求一大块的内存,使用循环是效率很低得。由于这个原因,使用CFStringGetCharacters函数代替。
第三种技术处理字符,如列表4所示,结合了一次性的方便与效率的批量字符串的访问。当你在做顺序处理字符的时候这些内联函数CFStringInitInlineBuffer和CFStringGetCharacterFromInlineBuffer给你快速的访问字符串的内容,使用这个编程接口,和CFStringInlineBuffer结构(通常在栈区)一起调用CFStringInitInlineBuffer函数和一个CFString字符范围。然后调用CFStringGetCharacterFromInlineBuffer多次,你需要使用一个索引到此范围内相对于开始的范围。因为这些都是内联函数他们访问CFString对象定期填补in-line缓冲区。
列表4 在一个内联缓冲区中处理字符
CFStringRef str;
CFStringInlineBuffer inlineBuffer;
CFIndex length,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);
}
CFStringGetBytes函数,复制一个CFString对象的内容到一个客户端提供的字节缓冲区,在“基本转换例程”描述。它之所以在另外的章节中描述,它拥有特别适合编码转换的功能。
像C字符串一样获取内容
你可能使用一些需要C字符串参数的编程接口。由于性能原因,访问CFString内容的策略和一个常用C字符串访问一样,首先获取这个字符串适当类型的指针,如果失败了,复制内容到本地缓冲区中,
列表1 像一个C字符串一样访问CFString内容
CFStringRef str;
CFRange rangToProcess;
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函数缓冲区或者在栈区或者在一块分配的内存中。这些函数取得字符时可能会失败,但是这种情况仅出以下两种情形中:CFString从Unicode内容转换到指定的编码失败或者缓冲区太小了。如果你需要一个字符缓冲区副本,或者不关注代码的性能,你可以简单的调用CFStringGetCString函数,而不去尝试取得指针。
像Unicode字符创一样获取内容
字符创对象提供一对类似使用16位编码缓冲区C字符串访问CFString函数。CFStringGetCharactersPrt和CFStringGetCharacters。这些函数的主要使用方法是相同的;你可以首先尝试去获取指向字符的指针,如果失败,你尝试去拷贝字符到提供的缓冲区中。这些函数是不同的,然而,他们需要一个参数,指定字符串的长度。
列表2 阐述了这些函数常用的用法
列表2 像Unicode字符一样访问CFString内容
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);
free(buffer);
}
这个例子描述了一个分配缓冲区(malloc),而不是栈区。你可以选择使用。因为你使用CFStringGetCharacters函数需要知道缓冲区的大小,分配内存较容易实现但是不高效。如果你为字符分配内存,当然,你必须释放缓冲区当你不在使用的时候。
字符处理
一些情况下你可能需要接收CFString的内容,不是整个字符块,而是一次接收一个Unicode字符。或许你可能寻找个别字符或字符序列,例如特别的控制字符去表明“recode”的开始和结束。字符串对象给你三种途径去处理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);
printf("%c",uchar);
}
尽管这个函数不会为一块字符而要求一大块的内存,使用循环是效率很低得。由于这个原因,使用CFStringGetCharacters函数代替。
第三种技术处理字符,如列表4所示,结合了一次性的方便与效率的批量字符串的访问。当你在做顺序处理字符的时候这些内联函数CFStringInitInlineBuffer和CFStringGetCharacterFromInlineBuffer给你快速的访问字符串的内容,使用这个编程接口,和CFStringInlineBuffer结构(通常在栈区)一起调用CFStringInitInlineBuffer函数和一个CFString字符范围。然后调用CFStringGetCharacterFromInlineBuffer多次,你需要使用一个索引到此范围内相对于开始的范围。因为这些都是内联函数他们访问CFString对象定期填补in-line缓冲区。
列表4 在一个内联缓冲区中处理字符
CFStringRef str;
CFStringInlineBuffer inlineBuffer;
CFIndex length,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);
}
相关文章推荐
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
- WCF:读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
- 操纵可变字符串对象(Manipulating Mutable String Objects)CFString
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。【轉】
- 使用web服务时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLen
- 比较,排序,搜索字符串对象( Comparing, Sorting, and Searching String Objects )CFString
- The internals of Python string interning(关于字符串is比较两个字符串对象的深度解析)
- Spring Mvc使用Jackson进行json转对象时,遇到的字符串转日期的异常处理(Can not deserialize value of type Date from String)
- 处理字符串的外部表示(Handling External Representations of Strings)CFString
- Know the Core Objects of Your App---了解应用程序的内核对象
- 【C#】解决进行反序列化时出错:。InnerException 消息是“反序列化对象 属于类型 System.String 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。
- [Yii Framework] Yii::app() 包含的对象列表 -- The list objects of Yii::app()
- JS:1.8字符串(string)对象(length,indexOf(),lastIndexOf(),replace(),match(),toUpperCase(),toLowerCase())
- 用lastIndexOf方法返回String对象内最后一次出现子字符串的字符位置的示例
- 四、(2)C++访问Java的String字符串对象
- JS:1.8,字符串(string)对象(length,indexOf(),lastIndexOf(),replace(),match(),toUpperCase(),toLowerCase())
- WPF程序设计 :第三章 内容的概念(The Concept of Content)
- javascript---the advantage of accessing the properties of object as array(objects as associative arrays)
- Accessing Objects Properties with Bracket Notation访问对象
- JSON对象转化为String字符串(包含方法体内容的输出)