2010-11-16 51 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