2010-11-16 102 views
1

這一定很簡單 - 當然這種方法應該可以工作 - 但我想對於雙字節到一個字節的問題我有一些問題。NSString stringWithCharacters Unicode問題

該代碼的目的是生成一定長度的0個字符的字符串(10減去將結束的數字的數量)。它看起來像這樣:

const unichar zero = 0x0030; 
NSString *zeroBuffer = [NSString stringWithCharacters:&zero length:(10 - [[NSString stringWithFormat:@"%i", photoID] length])]; 

替代第二線路(在地址&零鑄造物):

NSString *zeroBuffer = [NSString stringWithCharacters:(unichar *)&zero length:(10 - [[NSString stringWithFormat:@"%i", photoID] length])]; 

0x0030是數字0在Unicode的基本拉丁語部分的地址表。

如果photoID是123我想zeroBuffer是@「0000000」。什麼它實際上作爲最終是沿着線(不知道這將如何展示)這是一個零個,然後一些瘋狂的Unicode字符:

0䪨燱ܾ뿿;

我假設我有數據跨越字符邊界或什麼的。我已經暫時將其重寫爲一個愚蠢的子串事物,但是這似乎更有效率。

我在做什麼錯?

回答

3

stringWithCharacters:length:期望第一個參數是一個緩衝區的地址,其中包含要按順序插入到字符串中的每個字符。它爲第一個字符讀取字符零,然後前進到下一個存儲器地址並讀取下一個字符的任何數據,依此類推。這不是做你正在做的事情的正確方法。

唉,沒有內置重複這種字符串方法。請參閱here的答案以獲取建議。

或者,您可以完全避免這個問題,只是這樣做:

[NSString stringWithFormat:@"%010i", photoID]; 

這導致數格式化輸出十個零填充的十進制數。

+0

啊,這解釋了一切,謝謝,沒有更多的拉毛。我應該已經意識到「長度」並不意味着與「數」相同的東西。 :)您的替代解決方案非常適合我的需求。 FWIW我已經解決了[@「0000000000」substringToIndex:(10 -...),但它並不漂亮,但它可能是最快和最少的內存密集型(並且不可變的字符串!),如果我需要除了0之外的字符,它只是一個重複的字符,我知道它的最大長度相當小,再次感謝。 – 2010-11-16 03:37:04