unichar和NSString - 这些可以互换吗?

时间:2009-08-30 17:27:49

标签: iphone cocoa-touch uikit

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

  
      
  • (单字符)characterAtIndex:(NSUInteger)索引
  •   

我想知道这个unichar(显然不是NSString)是否可以转换为NSString或费用NSString用于比较目的?

并且:NSString内部是否只包含一系列unichar项目?

3 个答案:

答案 0 :(得分:67)

您有两个选择:第一个是向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位的无符号字符不同,它可以容纳超过0-255,因此它也可以保存unicode字符,即16位。 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/

希望有所帮助!

答案 1 :(得分:4)

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

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

所以只需使用:

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

yourChar参数必须是指针。

答案 2 :(得分:3)

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

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

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

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

它是Unicode的最佳实现之一。 如果你想更全面地了解它是如何工作的,你可以在opensource.apple.com上查看(大多数)CFString的来源。 它是C和核心基础(面向对象的C)并且相当风格化,所以不要期望同时理解它。

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