【问题标题】:Are UniChar (from CFString) and unichar (from NSString) the same?UniChar(来自 CFString)和 unichar(来自 NSString)是一样的吗?
【发布时间】:2014-03-17 13:25:56
【问题描述】:

我被这个问题触发了,因为我在这个答案的 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,我想确定..

【问题讨论】:

    标签: ios objective-c nsstring cfstring


    【解决方案1】:

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

    对于ASCII字符,你可以写

    unichar semicolon = ';';
    

    【讨论】:

    • 它们是 UCS-2 字符 :) 在某些时候,它是 Unicode 的同义词,但不再是。然而,出于实际目的,基本多语言区域之外的字符极为罕见。 NSStrings 也不是 Unicode 字符串——它们是 unichar 数组。 length 返回 unichars 的数量,而不是 Unicode 代码点的数量。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多