处理字符串的外部表示(Handling External Representations of Strings)CFString

来源:互联网 发布:心动网络官网电脑版 编辑:程序博客网 时间:2024/05/17 02:20

在核心基础中一个CFString的外部表现方式是在同一平台和不同的平台上将字符串数据写到磁盘和读出来的表单中。CFString对象格式化的外部表现是一个CFData对象。如果字符串的编码是Unicode编码,这个数据通常包含一个特殊字符叫做BOM("Byte Order Mark"),它指明数据的终止。当字符串外部表现是读操作,核心基础告诉BOM执行任何需要的字节交换。如果编码是Unicode不带BOM格式,这个数据被假定为大端。当你使用字符串对象去写出一个Unicode字符的外部表现时,BOM将会插入,除了编码常量创建的描述kCFStringEncodingUTF16BE,kCFStringEncodingUTF16LE,kCFStringEncodingUTF32BE和开CFStringEncodingUTF32LE。这些编码不要求BOM,因为字节序已经通过单词“BE(big-endian)”和“LE(little-endian)”明确的表明。

当你想保存通过CFString对象描述的字符数据,保存到磁盘文件或者发送到网络上的数据,首先你需要使用CFStringCreateExternalRepresentation函数转换CFString对象到CFData对象。CFData对象叫做CFString对象的“外部描述(External Representation)”。如果编码是Unicode编码,这个函数自动插入一个BOM(Byte Order Marker)到数据中表明终止。你可以使用CFStringCreateFromExternalRepresentation函数转换一个外部描述CFData对象到CFString对象。

列表1展示了外部描述(External-Representation)函数的用法。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对象时不关心它的可变状态。如果你想要改变CFStringCreateFromExternalRepresentation,你需要去创建一个它的可变副本。

除了使用CFStringCreateFromExternalRepresentation函数去创建一个CFString对象,然后去访问这个对象中的字符,你也可以使用CFData函数直接获取字符。列表3(前面的章节中) 展现了怎么样使用CFData函数CFDataGetLength和CFDataGetBytePtr。

data = CFStringCreateExternalRepresentation(NULL, resultString,
kCFStringEncodingMacRoman, '?');
if (data != NULL) {

            printf ("%.*s\n\n", (int)CFDataGetLength(data),
           CFDataGetBytePtr(data));
          CFRelease(data);
}


原创粉丝点击