Как я разложил NSString на несколько октетов - PullRequest
1 голос
/ 19 февраля 2011

Я хочу разбить строку NSString на строки NSString, каждая из которых содержит не более 75 октетов (в представлении UTF8).

Если бы моя строка NSString была бы полностью ascii, это было бы просто.

Но так как результирующая строка может иметь любую длину от 18 до 75 символов, я понятия не имею, как это сделать.

как это сделать?

Преобразовать строку в октеты, взять первые 75, преобразовать ее обратно в NSString и надеяться, что NSString скажет мне, что я разорвал символ utf8 на две части?

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

ответ Уоррена показал мне, что я на правильном пути. Вот что я придумал:

- (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;
}
0 голосов
/ 19 февраля 2011

NSString имеет

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)flag

дает неопределенную строку C, но допускает потерю символов

- (const char *)cStringUsingEncoding:(NSStringEncoding)encoding

попытаетсяесли вы не можете сделать это без потерь

, это может быть способом определить, что вы собираетесь разбить пару.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...