转换字符编码(Converting Between String Encodings)CFString

字符串对象给你大量的字符串编码转换的工具。一些常规做真实的转换,其他的显示哪些编码是可用的,帮助你选择在当前情形下得最佳编码。

如果你想要在任何两个non-unicode编码之间转换,你可以使用CFString对象像一个中介。就是说你有一个像Windows Latin 1的字符串编码,你想把它转换成MAC OS Roman。先把它转换成Unicode编码(CFString对象),然后将字符串的内容转换成其他需要的编码类型。

在本文的之前章节描述了一些创建和访问函数带有一个类型为CFStringEncoding编码参数,这些函数在表1中列出。为了制定源编码或者目标编码字符串(取决与你是要创建字符串还是访问它的内容),当你调用其中一个函数的时候指定你需要转换编码参数的enum值。在你的系统上调用转换函数之前使用CFStringIsEncodingAvailable函数去测试“外部”编码的可用性。

表一        编码转换函数

注意:并不是所有的转换结果都是成功的。如果你尝试转换一个大量字符集合组成的CFString对象时,转换通常是成功的。举个例子,假设你有一个包含ASCII字符和带Latin字符的Unicode字符串,你像把这个字符串转换成Mac OS Roman而不是转换成Mac OS Japanese。在这种情况下,你可以使用CFStringGetBytes函数指定“损耗”转换。这种类型的转换为每一个不能转换的字符串替代一个“损耗”字符串。CFStringGetBytes函数在下一节中将会描述。

基本转换惯例

在CFString对象中,这些转换字符编码的字符串对象函数有两个低级的转换函数,CFStringGetBytes 和 CFStringCreateWithBytes。就像他们的名字建议一样,这些函数操作一个已知大小的字节缓冲区。除了执行编码转换,他们在字符串(例如BOM)中处理任意指定字符,让他们有合适的外部描述。

然而,CFStringGetBytes函数在编码转换时是特别有用的,这是因为它允许一个损失字节(a loss byte)的规范。当你为损失字节指定一个字符,当它不能将Unicode值转换到正确的字符,这个函数将给出一个合适的字符。当你指定损失字节为“0”,将不允许“损失转换”,当遇到第一个字符它不能转换,这个函数返回(间接的)一个局部的字符集合,所有CFString其他的访问内容的函数都不允许损失转换。

列表1阐述了CFStringGetBytes怎么使用去转换一个字符串从系统编码到Windows Latin 1。注意这个函数的另一个功能:它允许你转换字符串到一个固定大小的缓冲区,每次一段.

     列表 1      使用CFStringGetBytes转换到不同的编码

CFStringRef str;
    CFRange rangeToProcess;
    
    str = CFStringCreateWithCString(NULL, "Hello World中国", kCFStringEncodingMacRoman);
    CFShow(str);
    rangeToProcess = CFRangeMake(0, CFStringGetLength(str));
    
    while (rangeToProcess.length > 0) {
        UInt8 localBuffer[100];
        CFIndex usedBufferLength;
        CFIndex numChars = CFStringGetBytes(str, rangeToProcess, kCFStringEncodingMacChineseSimp, '?', FALSE,localBuffer,100 , &usedBufferLength);
        if (numChars == 0) break;
        rangeToProcess.location += numChars;
        rangeToProcess.length -= numChars;
    }

如果需要转换的字符串相对较小,你可以用不同的方法去使用CFStringGetBytes函数。你可以调用这个函数去两个东西将缓冲区参数设置为NULL。如果函数返回值大于0则转换是可能的。如果转换是可能的,最后一个参数(usedBufLen)将包含包含这个转换需要多少字节。有了这个信息,你可以分配一个适合大小的缓冲区,去转换字符串到需要的编码。然而,如果这个字符串很大,这个技术有它的缺点;去获取长度可能很耗费时间,而且会分配大量的内存。

编码转换工具

除了编码转换函数,字符串对象提供大量的函数帮助你去寻找哪一个编码是可用的,在这些可用的编码中,哪一个在你程序中使用是最好。

字符编码转换

CFStringGetSmallestEncoding函数决定在特殊系统是可以使用的最小的编码(表现一个字符需要的最小字节项)。CFStringGetFastestEncoding函数获取当前系统上从Unicode编码最快的转换的编码。CFStringGetSystemEncoding函数获取操作系统使用的编码。

可用的编码

使用CFStringIsEncodingAvailable和CFStringGetListOfAvailableEncodings函数获取在你的系统上可用的编码信息。

映射编码集

你可以使用CFStringConvertEncodingToWindowsCodepage和CFStringConvertWindowsCodepageToEncoding函数去转换Windows代码页数量和CFStringEncoding值。与Cocoa NSString编码常量中函数集合类似,MIME编码使用IANA字符集标识符。

支持的编码

核心基础字符串对象支持在CFString对象的Unicode编码和范围广泛的国际、国家和行业编码之间的转换。支持的编码分为两类,一种在CFString.h中用CFStringBuiltInEncodingsenum定义的“内部”集合和一个在CFStringEncodingExt.h“中用CFStringEncodingsenum定义外部”集合。不管是转换成CFString对象还是从CFString对象装换在内部集合中的编码保证在任何平台的转换都是可用的。内部编码(在CFStringBuiltInEncodings被设计成常量名字)包括:

kCFStringEncodingMacRoman

kCFStringEncodingWindowsLatin1

kCFStringEncodingISOLatin1

kCFStringEncodingASCII

kCFStringEncodingUnicode

kCFStringEncodingUTF8

kCFStringEncodingNonLossyASCII

kCFStringEncodingUTF16

kCFStringEncodingUTF16BE

kCFStringEncodingUTF32

如果底层系统支持这种编码,转换使用外部集合编码是可能的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值