例如我NSString
是str = @"我就是测试一下"
或str = @"我"
。我想限制某个字节长度。例如byteLength = 10
。
我知道subSrtring不是str.length=10
如何从NSString获取某个字节长度的子串,谢谢
答案 0 :(得分:4)
您可以使用dataUsingEncoding
方法从NSData
获取NSString
。然后使用length
和bytes
属性获取byte length
或bytes
然后,如果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 @"";
}
结果:
小心:
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];
}