如何将NSString溢出到多个八位字节中

时间:2011-02-19 13:30:04

标签: objective-c encoding nsstring

我想将一个NSString拆分为NSStrings,每个NSStrings不超过75个八位字节(以UTF8表示)。

如果我的NSString完全是ascii,那将是一个明智的选择。

但是由于结果字符串的长度可以在18到75个字符之间,所以我不知道该怎么做。

这样做的方法是什么?

将字符串转换为八位字节,取第一个75,将其转换回NSString并希望NSString告诉我,我已经将utf8字符分成两部分?

2 个答案:

答案 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

这可能是一种检测你即将分手的方法。