2012-08-01 74 views
6

我實現了一個與文本字段相關聯的自定義鍵盤,因此當用戶按下刪除按鈕時,我從字符串中刪除最後一個字符,並手動更新當前文本字段文本。如何從NSString中刪除最後一個Unicode符號

NSRange range = NSMakeRange(currentTextFieldString.length-1, 1); 
[currentTextFieldString replaceCharactersInRange:range withString:@""]; 

到目前爲止這麼好。

現在,問題是,用戶可以選擇輸入一些特殊的unicode符號,這些不是1個字節,它們也可以是2個字節,現在按下刪除按鈕時,我必須刪除整個符號,但是如果我按照上面的方法,用戶必須按兩次刪除按鈕。

在這裏,如果我這樣做:

NSRange range = NSMakeRange(currentTextFieldString.length-2, 2); 
[currentTextFieldString replaceCharactersInRange:range withString:@""]; 

它工作正常,但隨後,正常的字符,這僅僅是1個字節,得到在同一時間刪除兩次。

如何處理這種情況?

在此先感謝。

編輯:

令人奇怪的是,如果我切換到iPhone的鍵盤,它適當的處理這兩種情況。必須有一些方法來做到這一點,有一些我錯過了,但我無法弄清楚什麼。

+0

你的自定義鍵盤如何添加字符? – Joe 2012-08-01 13:13:27

+0

我在這個問題上的答案可能會幫助你http://stackoverflow.com/q/11567049/1487063 – Dustin 2012-08-01 13:14:16

+0

@Joe:無論何時用戶按下按鈕,我都會捕獲相應的字符,將其附加到文本字段的當前文本中,並將其指定爲文本字段的文本。 – 2012-08-01 13:22:08

回答

16

這是問題所在。 NSString使用UTF-16編碼。許多常見的Unicode字形只佔用一個unichar(16位無符號值)。但是,一些字形會佔用兩個不一致的字符。更糟糕的是,一些字形可以被組合或分解,例如,可能是一個Unicode代碼點,或者它可能是兩個 - 緊跟着一個e。這使得很難做到你想刪除一個「角色」,因爲很難說出它需要多少個單獨的角色。

幸運的是,NSString有一個方法可以解決這個問題:-rangeOfComposedCharacterSequenceAtIndex:。你需要做的是得到最後一個unichar的索引,運行這個方法,返回的NSRange會告訴你從哪裏刪除。它像這樣(未測試):

NSUInteger lastCharIndex = [myString length] - 1; // I assume string is not empty 
NSRange rangeOfLastChar = [myString rangeOfComposedCharacterSequenceAtIndex: lastCharIndex]; 
myNewString = [myString substringToIndex: rangeOfLastChar.location]; 
+0

+1這正是我正在尋找的東西。深藏在文檔內部以查明。 – 2012-08-01 14:37:50

0

如果默認情況下無法使其工作,請使用if/else塊並測試最後一個字符是否爲特殊字符的一部分。如果是,則使用子字符串length-2,否則使用子字符串length-1

+0

感謝您的回答!但是,如果說用戶從鍵盤輸入一個字符,比如說@ /#/ $等,那麼這不是一個問題,如果我檢查最後一個字符是否是特殊字符,在這種情況下就是這樣,我們會刪除2個字符,我們要刪除哪個字符? – 2012-08-01 13:37:23

+0

我的意思是,在你的if語句中檢查給你問題的特定字符。不是那些不是。 – Dustin 2012-08-01 13:39:02

+0

哦,是的,但有些給我的問題存在於這兩個:)這是我的問題的癥結所在。 – 2012-08-01 13:40:55

0

我不知道具體字符字節長度到底是什麼問題。

我的建議是:

  • 商店字符串長度設置了一個param,添加任何新角色之前
  • 如果用戶選擇退格(刪除最後一個字符),那麼從去年長到新的長度刪除的字符串。例如,上次保存的字符串長度是5,新的字符串長度是7,然後刪除索引從0到4的新字符串,因此它將裁剪剩餘的字符。

這是另一種方式,因爲我不知道內部的確切問題。

但我想邏輯上這個解決方案應該工作。

享受編碼:)

+0

哦,是的,這應該工作,我猜。感謝您的回答,但我仍然困惑於如何使用更多方法解決問題。我嘗試了各種各樣的東西,比如將其轉換成NSData,然後刪除字節,以查看實際發生的情況,但無濟於事: – 2012-08-01 13:39:41

相關問題