如何从NSString获取某个字节长度的子串

时间:2013-09-03 03:31:48

标签: ios objective-c nsstring byte string-length

例如我NSStringstr = @"我就是测试一下"str = @"我"。我想限制某个字节长度。例如byteLength = 10

我知道subSrtring不是str.length=10如何从NSString获取某个字节长度的子串,谢谢

3 个答案:

答案 0 :(得分:4)

您可以使用dataUsingEncoding方法从NSData获取NSString。然后使用lengthbytes属性获取byte lengthbytes

然后,如果NSData's length > your certain length使用+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length;方法获取特定长度字节NSData,则应注意返回NSData可能无法解码{ {1}}

最后,您可以使用NSString方法获取所需的结果- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;

您可以使用以下代码:

NSString

您可以像这样调用上述方法:

- (NSString *)fetchStringWithOriginalString:(NSString *)originalString withByteLength:(NSUInteger)length
{
    NSData* originalData=[originalString dataUsingEncoding:NSUTF8StringEncoding];
    const char *originalBytes = originalData.bytes;

    //make sure to use a loop to get a not nil string.
    //because your certain length data may be not decode by NSString
    for (NSUInteger i = length; i > 0; i--) {

        @autoreleasepool {
            NSData *data = [NSData dataWithBytes:originalBytes length:i];
            NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            if (string) {
                return string;
            }
        }

    }
    return @"";
}

结果: enter image description here

小心: NSString* originalString= @"我就是测试一下"; NSString *string = [self fetchStringWithOriginalString:originalString withByteLength:10]; NSData* stringData=[string dataUsingEncoding:NSUTF8StringEncoding]; NSLog(@"10 bytes string : %@ ; it only %i bytes",string,stringData.length); 可能会返回- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;

正如苹果所说:nil回归:

  

通过将数据中的字节转换为初始化的NSString对象   使用编码的Unicode字符。返回的对象可能是   与原始接收器不同。如果是,则返回nil   初始化由于某种原因失败(例如,如果数据没有   表示编码的有效数据。)

因此,您应该使用for循环来获取可以按- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;

解码的最近长度数据

答案 1 :(得分:0)

使用

[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]

答案 2 :(得分:0)

我认为这应该有效:

NSUInteger bytes = [incomingText lengthOfBytesUsingEncoding:NSUTF8StringEncoding];

if (bytes > MAX_TEXT_BYTES) {
    int length = [incomingText length];
    int cutoffIndex = (int)(MAX_TEXT_BYTES * (length / bytes));
    return [incomingText substringToIndex:cutoffIndex];
}