2009-08-31 4 views
21

私はこのNSStringまたはNSMutableStringの文字数をカウントしますか?

NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString: myString]; 
[myCharSet count]; 

を試みたが、NSCharacterSetカウントに応答しないことがあります警告を取得しました。これは、デスクトップアプリケーションではなく、上記のコードが動作すると思うiPhoneではありません。

+0

明確にするには、文字列内の一意の文字数を求めますか? –

+0

いいえ - 文字数の合計です。 – 4thSpace

答えて

76

私はここで何かが欠けているかもしれないが、何を、単純にやってと間違っている:

NSUInteger characterCount = [myString length]; 

単なる文字列の文字数を取得するには、私はNSCharacterSetで周りの混乱に何らかの理由が表示されません。

+14

ちょうどきれいです - '-length'は(' NSString'ドキュメントで定義されているように) '受信者のUnicode文字数を返します。技術的には、実際に 'Unicode文字の数ではなく' UTF-16コードユニットの数を返すので、ドキュメントは間違っています。この区別は、プログラマーや使用の大多数にとって重要ではありませんが、重要な結果をもたらします。例えば、 '[@" \ U0010ffff "length]'は、Unicode文字が1つ含まれていても '2'を返します。 'characterAtIndex:'は '0'と' 1'はそれぞれ '0xdbff'と' 0xdfff'を返します。 – johne

+8

^これは非常に重要です。なぜなら、ほとんどのiOSユーザはemojisとタイプしています。これは、上記の 'length'メソッドを使って2文字とみなされます... 1文字であっても。 –

+0

これはCoreDataを使用していると予想されるよりも重要である可能性があります。 ""のような代理ペアを分割すると、コミットフェーズ中にCoreDataの検証ルールを渡すことができなくなります。CoreDataはエラーコード1671を表示します。本当に何が起こっているのか理解するために私は半年かかっていました。 – peak

0

NSCharacterSetはどちらのプラットフォームでもNSSetのサブクラスではないため、iPhoneでも動作しません。

NSSetをサブクラス化しない理由を実際に調べる必要がある場合は、値を追加して、NSCharacterSetとして返すメソッドを用意してください。

+0

NSSetはクラスクラスタであるため、容易に(または実質的に)サブクラス化されません。 –

+0

文字列内のすべての文字のカウントを取得する簡単な手法はありませんか? – 4thSpace

+1

はいあります(実際の長さ):[myString lengthOfBytesUsingEncoding:NSUTF32StringEncoding]/4; – Stephane

関連する問題