【问题标题】:unichar and NSString - how interchangeable are these?unichar 和 NSString - 它们的互换性如何?
【发布时间】:2009-08-30 17:27:49
【问题描述】:

有一个 NSString 方法 -characterAtIndex: 返回一个 unichar。

  • (unichar)characterAtIndex:(NSUInteger)index

我想知道这个显然不是 NSString 的 unichar 是否可以转换为 NSString 或提供给 NSString 以进行比较?

并且:NSString 内部是否仅包含 unichar 项数组?

【问题讨论】:

    标签: iphone cocoa-touch uikit


    【解决方案1】:

    你有两个选择:第一个是在 NSString 中添加 stringWithUnichar 方法的类别:

    @interface NSString (MNNSStringWithUnichar)
    + (NSString *) stringWithUnichar: (unichar) value;
    @end
    
    
    @implementation NSString (MNNSStringWithUnichar)
    
    + (NSString *) stringWithUnichar:(unichar) value {
         NSString *str = [NSString stringWithFormat: @"%C", value];
         return str;
    }
    
    @end
    

    然后用

    调用它
    NSString *otherString = @"TestString";
    
    NSString *str = [NSString stringWithUnichar:[otherString characterAtIndex:1]];
    

    或者你可以直接这样:

    NSString *str = [NSString stringWithFormat:@"%C",[otherString characterAtIndex:1]];
    

    如果要重复使用,或者只需要一次,请选择类别,使用 stringWithFormat 示例!

    不确定 NSString 的内部结构,但我猜它可能是包装了一个

    unichar *
    

    或一个 unichars 数组(如 C char *)

    unichar 只是一个 16 位的值,用于存储字符。与只有 8 位的 unsigned char 不同,它可以容纳超过 0-255,因此它也可以容纳 16 位的 unicode 字符。 NSString 是一个(集群)类[es],其中包含一个 unichars 数组

    编辑

    这里有几篇关于人们认为 NSString 是什么的文章:

    http://cocoawithlove.com/2008/08/string-philosophies-char-arrays.html

    http://www.reddit.com/r/programming/comments/6v1yw/string_philosophies_char_arrays_stdstring_and/

    希望对您有所帮助!

    【讨论】:

    • 你忘记了“TestString”之前的@?
    【解决方案2】:

    另一种选择是使用类方法:

    + (id)stringWithCharacters:(const unichar *)characters length:(NSUInteger)length;
    

    所以只是使用:

    yourString = [NSString stringWithCharacters: &yourChar length: 1];
    

    yourChar 参数必须是指针。

    【讨论】:

      【解决方案3】:

      NSString 实际上是一个类簇。这意味着由于各种原因,包括基于内容和大小的性能,以及在创建 NSString 时支持免费桥接到 CFString,您实际上可能会获得许多向 isKindOf 返回 YES 的私有类之一:当您询问它是否是 NSString 和它将响应 NSString 类中的所有方法。它就像一个协议,但所有对象都会在公共 API 中说和做,并且是 NSString。

      正如 NSString 和 CFString 的文档所述,它在概念上是一个 UTF16 unichar 数组 它可能并且将使用不同的内部表示,它对实现具有优势。通常性能有时是内存大小。但是您可以依靠它在被询问时为您提供一个 unichar 的 C 数组或 API 承诺的任何其他内容。

      它已经成熟了很长时间,并且几乎在每个版本中都进行了内部调整。

      简而言之,是的,您可以将其视为由 UTF16 unichar 数组支持,该数组很大程度上与 Unicode 标准中逻辑字符串的描述相匹配。但要记住的是,你真的不应该担心里面有什么,只要它告诉你的是里面的东西。

      它是 Unicode 的最佳实现之一。 如果你想更全面地了解它是如何工作的,你可以在 opensource.apple.com 上查看(大部分)CFString 的源代码 它是 C 和 Core Foundation(面向对象的 C)并且相当程式化,所以不要指望一下子就能理解它。

      NSString 和 CFString 确实有从 unichar 返回和创建的方法。大多数人大部分时间都不应该需要这些。 如果你这样做了,要小心,准备好阅读很多书并犯一些幼稚的错误。 Unicode 是一个很大的话题。正确处理它是该级别的一门科学和一门艺术。这就是 NSString 的原因之一。它处理了很多困难的事情,所以你不必经常这样做,除非你想要或需要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 1970-01-01
        • 2021-10-30
        • 2016-02-08
        • 1970-01-01
        相关资源
        最近更新 更多