UniChar(来自CFString)和unichar(来自NSString)是一样的吗?

时间:2014-03-17 13:25:56

标签: ios objective-c nsstring cfstring

我被触发了这个问题,因为我在这个答案中对NSString使用了一个类别方法来计算特定字符的出现次数:

https://stackoverflow.com/a/15947190/472599

这种方法非常快,通过使用特殊的CFString方法枚举字符串的内容。它需要一个UniChar作为参数。为了获得UniChar,我使用了:

unichar semicolon = [@";" characterAtIndex: 0];

因为我找不到任何能让我在NSString中使用UniChar的东西。

编译器不会抱怨这一点(通过unichar代替UniChar

类型的定义是:

// in MacTypes.h
typedef UInt16                          UniChar;
// and:
typedef unsigned short                  UInt16;

// in NSString.h:
typedef unsigned short                  unichar;

所以这些类型现在似乎是相同的(iOS 7.1)。但是,我们能够永远期待这种情况吗? 看到NSInteger在转移到64位时从int更改为long,我想确定..

2 个答案:

答案 0 :(得分:2)

只是澄清一下:" UniChar"和" unichar" 不是 Unicode字符。它们是UTF-16组件。就像单个字节是UTF-8组件一样,UniChar和unichar是UTF-16组件。单个Unicode字符由一到四个UTF-8组件或一个或两个UTF-16组件组成。

对于ASCII字符,您只需编写

即可
unichar semicolon = ';';

答案 1 :(得分:1)

他们是一样的 - 是的,他们是。 永远相同 - 谁知道。让它们与众不同会破坏很多代码,这是肯定的。