访问字符串对象的内容(Accessing the Content of String Objects)CFString
来源:互联网 发布:大数据新技术ppt 编辑:程序博客网 时间:2024/05/04 19:38
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);
}
- 访问字符串对象的内容(Accessing the Content of String Objects)CFString
- 操纵可变字符串对象(Manipulating Mutable String Objects)CFString
- 比较,排序,搜索字符串对象( Comparing, Sorting, and Searching String Objects )CFString
- CFString去掉string中的字符串(空格)
- 处理字符串的外部表示(Handling External Representations of Strings)CFString
- The internals of Python string interning(关于字符串is比较两个字符串对象的深度解析)
- 创建和复制字符串(CFString)
- Overview: Accessing Other Game Objects 访问其他游戏物体
- Accessing the AutoCAD objects referred to by fields using .NET
- Ruby: how to sort array of string parsing the content
- 四、(2)C++访问Java的String字符串对象
- Accessing Resources(访问资源)
- 字符串存取(CFString)
- 访问固定的内存位置(Accessing fixed memory locations)
- 转换字符编码(Converting Between String Encodings)CFString
- 对象数组(Array of Objects)
- Mapping of Windows Handles to Objects(Windows句柄到(C++)对象的映射)
- C++ content of std::string
- jdk和环境变量配置
- 安装Asterisk
- Websphere 部署EAR失败: EAR 文件可能已损坏和/或不完整
- iOS cell的可重用机制
- 手工设置iphone5的屏幕方向
- 访问字符串对象的内容(Accessing the Content of String Objects)CFString
- 浅谈Asterisk的语音编码(codec)
- poj 2723 Get Luffy Out(2-sat + 二分)
- 光大证券毁在一个笨蛋程序员手里
- Asterisk配置文件语法
- 王知昆:《浅谈用极大化思想解决最大子矩形问题》
- Power BI for Office 365(八)共享查询
- 【索引】Backtracking - Hard
- git断点续传