Как преобразовать NSString в UTF в цитируемой печатной форме, используя iOS SDK? - PullRequest
1 голос
/ 13 августа 2011

Мне нужно преобразовать строку (возможно, с нелатинскими символами) в UTF-8, дополнительно закодированную в цитируемой печатной форме .

Например, у меня есть строка, например"привет", и мне нужно преобразовать его в "= D0 = BF = D1 = 80 ......." что-то в этом роде.

Может ли кто-нибудь мне помочь?

Ответы [ 6 ]

1 голос
/ 23 апреля 2017

Приведенные выше ответы работают, но они кодируют всю строку. Обычно это не то, что вам нужно, особенно если вы используете этот код для чего-то вроде составления электронного письма.

Вероятнее всего, после этого вы будете использовать метод кодирования только тех символов, не являющихся ascii в QP.

Ввод:

Simply place the bass—that’s the whole bass—into the Bass-o-matic.

Выход (naiive):

=53=69=6D=70=6C=79=20=70=6C=61=63=65=20=74=68=65=20=62=61=73=73=E2=80=94=74=68=61=74=E2=80=99=73=20=74=68=65=20=77=68=6F=6C=65=20=62=61=73=73=E2=80=94=69=6E=74=6F=20=74=68=65=20=42=61=73=73=2D=6F=2D=6D=61=74=69=63=2E

Вывод (улучшено):

Simply place the bass=E2=80=94that=E2=80=99s the whole bass=E2=80=94into the Bass-o-matic.

Нечто подобное:

- (NSString *)qpEncodedStringWithString:(NSString *)string {
    NSCharacterSet *asciiSet = [NSCharacterSet characterSetWithRange:NSMakeRange(0, 127)];
    NSCharacterSet *invertedAscii = [asciiSet invertedSet];

    // if the string contains non-ascii characters, we need to encode them
    // otherwise, we'll just return the string below
    if ([string rangeOfCharacterFromSet:invertedAscii].location != NSNotFound) {

        // because the % sign is, itself, an ascii character, we must first replace it
        // with a placeholder unlikely to occur in a string, but still within ascii
        NSString *percentPlaceholder = @"QqQxXxPpP";
        string = [string stringByReplacingOccurrencesOfString:@"%" withString:percentPlaceholder];

        // use Apple's method to percent encode the string
        string = [string stringByAddingPercentEncodingWithAllowedCharacters:asciiSet];

        // replace those percents with = signs
        string = [string stringByReplacingOccurrencesOfString:@"%" withString:@"="];

        // and restore the true percent symbols
        string = [string stringByReplacingOccurrencesOfString:percentPlaceholder withString:@"%"];
    }

    return string;
}

(строится из этого ответа для декодирования QP-строк из bensnider )

1 голос
/ 13 августа 2011

Это почти то же самое, что и ответ Антона , только намного короче:

- (NSString *)quotedPrintableString
    NSMutableString *encoded = [NSMutableString stringWithCapacity:3*[self length]];
    const char *characters = [self UTF8String];
    NSUInteger length = strlen(characters);
    for (NSUInteger i = 0; i < length; ++i) {
        char character = characters[i];
        int left = character & 0xF;
        int right = (character >> 4) & 0xF;
        [encoded appendFormat:@"=%X%X", right, left];
    }
    return encoded;
}
1 голос
/ 13 августа 2011

Ну, я не буду следовать всем спецификациям этой кодировки.Предполагая, что у вас нет хвостовых пробелов, символов новой строки и других плохих вещей, вот код, который вам нужен:

@interface NSString(QuotedPrintable)

- (NSString *)quotedPrintable;

@end

@implementation NSString(QuotedPrintable)

- (NSString *)quotedPrintable {
    const char *utfString = [self UTF8String];
    char *p = utfString;
    NSMutableString *result = [NSMutableString stringWithString:@""];

    while (*p) {
        char chars[2];
        char c = *p;
        for (int i = 0; i < 2; i++) {
            int val = ((int)c & 15);
            if (val < 10) {
                chars[i] = '0'+val;
            } else {
                chars[i] = 'A'+(val-10);
            }
            c = c >> 4;
        }
        [result appendFormat:@"=%c%c", chars[1], chars[0]];
        p++;
    }
    return [NSString stringWithString:result];
}

@end

Для привет это дает = D0 = BF= D1 = 80 = D0 = B8 = D0 = B2 = D0 = B5 = D1 = 82

0 голосов
/ 16 июля 2013

Используйте это -

NSString *yourString = @"Hello world";
const char *utfString = [yourString UTF8String];
NSSTring* finalEncodedString = [NSString stringWithUTF8String:utfString];

Теперь напечатайте 'finalEncodedString', теперь это строка в кодировке UTF8.

0 голосов
/ 13 августа 2011
NSString *yourString = @"Hello world";
char *utfString = [yourString UTF8String];
0 голосов
/ 13 августа 2011

Попробуйте [NSString stringWithUTF8String:yourString];

...