2012-05-05 8 views
8

私はユーザが文字を入力するUITextFieldを持っています。それは私がそれを実際の長さに戻すにはどうすればいいのですか?文字列にA〜Z 1〜9の文字が含まれている場合、期待どおりに機能しますが、絵文字や特殊文字はダブルカウントされます。それにNSStringの長さ - 特殊文字

が最も簡単な形式ですが、これは単なる絵文字のようないくつかの特殊文字の2文字の割り当てを持っています

NSLog(@"Field '%@' contains %i chars", myTextBox.text, [myTextBox.text length]); 

私はcharacterAtIndexsubstringFromIndexなどを使用して、各文字をループしようと、どこにもなっていません。以下の答えを1として

、正確なコードは、文字をカウントするために使用(これは正しいアプローチであると思いますが、それは動作します。):

NSString *sString = txtBox.text; 

__block int length = 0; 
[sString enumerateSubstringsInRange:NSMakeRange(0, [sString length]) 
         options:NSStringEnumerationByComposedCharacterSequences 
         usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 

          length++;         
         }]; 

NSLog(@"Total: %u", length); 

答えて

12

[myTextBox.text length]リターンunicharsの数とないの可視長さを文字列。 é = e+´ 2 unicharsです。絵文字の文字には、1つ多くのunicharが含まれている必要があります。

このサンプルでは、​​文字列内の各文字ブロックを列挙しています。あなたはどちらsubstringRangeの範囲を記録する場合、それは長い1

__block NSInteger length = 0; 
[string enumerateSubstringsInRange:range 
          options:NSStringEnumerationByComposedCharacterSequences 
         usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
    length++; 
}]; 

よりもあなたがセッション128を行くと見なければならないことができることを意味 - 2011 WWDCからアドバンステキスト処理を。彼らはなぜそれがそうであるか説明します。それは本当に素晴らしいです!

私はこれがどんな助けでもあったと思う。
乾杯!

+0

おかげで非常に非常に非常に特殊な文字や絵文字で動作するよう、以下のオプションを検討することができます。いくつかの微調整の後にそれが働くようになった!上に更新して答えとして受け入れました(私が何か間違ってしまったかどうかを教えてください)。そのビデオをウォッチリストに追加して、本当に磨き上げなければならないことがいくつかあります...ありがとうございました – Ralphonzo

+2

このメソッドはフラグなどの絵文字では機能しません。あなたのメソッドはこれらの文字に対して2を返します。 – Swordsfrog

+0

ライフセーバー、ありがとう! – beebcon

0

は、我々はまた、溶液

const char *cString = [myTextBox UTF8String]; 

int textLength = (int)strlen(cString); 

これは

+0

申し訳ありませんが、これはemojisで動作しません – cornr