2012-05-05 41 views
8

Tôi có một số UITextField mà người dùng sẽ nhập ký tự vào. Nó đơn giản như thế nào, làm sao tôi có thể trả về chiều dài thực của nó? Khi chuỗi chứa ký tự A-Z 1-9, nó hoạt động như mong đợi nhưng bất kỳ biểu tượng cảm xúc hoặc ký tự đặc biệt nào đều được tính gấp đôi.Chiều dài NSString - Các ký tự đặc biệt

Trong đó là dạng đơn giản nhất, điều này chỉ có một phân bổ 2 ký tự đối với một số ký tự đặc biệt như biểu tượng cảm xúc:

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

Tôi đã cố gắng lặp qua từng nhân vật sử dụng characterAtIndex, substringFromIndex, vv và cũng chẳng thể.

Như mỗi câu trả lời dưới đây, mã chính xác sử dụng để đếm ký tự (hy vọng đây là cách tiếp cận đúng, nhưng nó hoạt động ..):

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); 

Trả lời

12

Các [myTextBox.text length] lợi nhuận tính của unichars và không phải là chiều dài có thể nhìn thấy của chuỗi. é = e+´ là 2 unichars. Các ký tự Emoji phải chứa nhiều hơn 1 unichar.

Mẫu này dưới đây liệt kê thông qua từng khối ký tự trong chuỗi. Có nghĩa là nếu bạn đăng nhập khoảng substringRange nó có thể dài hơn 1.

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

Bạn nên đi và xem phiên 128 - Advance xử lý văn bản từ năm 2011 WWDC. Họ giải thích lý do tại sao nó như thế. Nó thực sự tuyệt vời!

Tôi hy vọng điều này sẽ giúp bạn.
Chúc mừng!

+0

Cảm ơn rất rất nhiều. Sau khi một số tinh chỉnh đã làm cho nó hoạt động! Đã cập nhật ở trên và được chấp nhận là câu trả lời (hãy cho tôi biết nếu tôi đã làm bất cứ điều gì sai!). Sẽ thêm video đó vào danh sách theo dõi của tôi, có một vài điều tôi thực sự cần phải đánh bóng ... Cảm ơn một lần nữa – Ralphonzo

+2

Phương pháp này không hoạt động với một số ký tự biểu tượng cảm xúc như cờ. Phương thức của bạn sẽ trả về 2 cho các ký tự này. – Swordsfrog

+0

Lifesaver, cảm ơn! – beebcon

0

Chúng tôi cũng có thể xem xét lựa chọn dưới đây như là một giải pháp

const char *cString = [myTextBox UTF8String]; 

int textLength = (int)strlen(cString); 

này sẽ làm việc với ký tự đặc biệt và biểu tượng cảm xúc

+0

xin lỗi điều này không hoạt động với biểu tượng cảm xúc – cornr

Các vấn đề liên quan