我想将一个NSString拆分为NSStrings,每个NSStrings不超过75个八位字节(以UTF8表示)。
如果我的NSString完全是ascii,那将是一个明智的选择。
但是由于结果字符串的长度可以在18到75个字符之间,所以我不知道该怎么做。
这样做的方法是什么?
将字符串转换为八位字节,取第一个75,将其转换回NSString并希望NSString告诉我,我已经将utf8字符分成两部分?
答案 0 :(得分:1)
- (NSString *)foldString:(NSString *)string withOctetCount:(NSInteger)octetCount {
NSMutableString *output = [NSMutableString string];
NSData *stringData = [string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSInteger convertedBytes = 0;
while (convertedBytes < [stringData length]) {
NSString *subString = nil;
NSInteger usedLength = octetCount;
if (convertedBytes > 0) {
// all lines after the first one get a space as prefix. so use one octet less in those lines
usedLength--;
}
if (convertedBytes + usedLength > [stringData length]) {
usedLength = [stringData length] - convertedBytes;
}
while (!subString) {
NSData *data = [stringData subdataWithRange:NSMakeRange(convertedBytes, usedLength)];
subString = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
if (!subString) {
usedLength--;
if (usedLength == 0) {
// TODO: remove abort
abort();
return nil;
}
}
}
// NSLog(@"Used %d octets", usedLength);
if (convertedBytes == 0) {
// Dont prefix with space on first line
[output appendString:subString];
}
else {
[output appendFormat:@"\r\n %@", subString];
}
convertedBytes += usedLength;
}
return output;
}
答案 1 :(得分:0)
NSString
已
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)flag
给出一个未终止的C字符串,但允许丢失字符
- (const char *)cStringUsingEncoding:(NSStringEncoding)encoding
将尝试为您提供一个C字符串,但barf为NULL
这可能是一种检测你即将分手的方法。