расшифровка кавычек

Я ищу способ декодировать цитируемые печатные формы.

Цитированные печатные формы предназначены для арабских символов и выглядят следующим образом:

=D8=B3=D8=B9=D8=A7=D8=AF

Мне нужно преобразовать его в строку и сохранить или отобразить.

Я видел сообщение о stackoverflow наоборот (кодирование), но не смог найти декодирование.


person Net Solver    schedule 25.11.2011    source источник
comment
Вот категория NSString, которая анализирует кодированные слова MIME с кавычками: github.com/hpique/NSString-MimeEncodedWord   -  person hpique    schedule 24.12.2012


Ответы (6)


Хм, это немного хакерски, но вы можете заменить символы = на символ % и использовать метод NSString stringByReplacingPercentEscapesUsingEncoding:. В противном случае вы могли бы разделить строку на символы =, преобразовать каждый элемент в значение байта (это легко сделать с помощью NSScanner), поместить значения байтов в массив C и использовать метод initWithBytes:length:encoding: NSString.

Обратите внимание, что ваш пример технически не в формате кавычек-печати, который указывает, что кавычка-печать представляет собой последовательность из трех символов, состоящую из символа =, за которым следуют две шестнадцатеричные цифры.

person bensnider    schedule 25.11.2011
comment
пример находится в кавычках, но в начале отсутствовал знак =: =D8=B3=D8=B9=D8=A7=D8=AF - person Net Solver; 26.11.2011
comment
Хм, я действительно думаю, что мой первый случай менее хакерский, чем я себе это представлял. Я предполагал, что он не поймает ошибочный символ = в теле, но, видимо, символы = также должны быть закодированы qp. Так что да... должно работать. - person bensnider; 15.02.2012

В моем случае я исходил из EML... ответ Бенснайдера отлично сработал... quoted-printable (по крайней мере, в EML) использует знак =, за которым следует \r\n для обозначения переноса строки, так что это был код, необходимый для чисто перевести:

(Сделано как категория, потому что я люблю их)

@interface NSString (QuotedPrintable)
- (NSString *)quotedPrintableDecode;
@end

@implementation NSString (QuotedPrintable)
- (NSString *)quotedPrintableDecode
{
    NSString *decodedString = [self stringByReplacingOccurrencesOfString:@"=\r\n" withString:@""]; // Ditch the line wrap indicators
    decodedString = [decodedString stringByReplacingOccurrencesOfString:@"=" withString:@"%"]; // Change the ='s to %'s
    decodedString = [decodedString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // Replace the escaped strings.
    return decodedString;
}
@end

Что отлично сработало для декодирования моих объектов EML/UTF-8!

person BadPirate    schedule 04.06.2012

Ответ Бенснайдера правильный, это самый простой способ.

вам нужно заменить "=" на "%"

NSString *s = @"%D8%B3%D8%B9%D8%A7%D8%AF";
NSString *s2 = [s stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

s2 хранит «سعاد», что имеет смысл, так что это должно работать прямо без взлома

person Ehab Amer    schedule 15.02.2012

В некоторых случаях конец строки не "=\r\n", а только "=\n", и в этом случае вам нужен еще один шаг: decodedString = [self stringByReplacingOccurrencesOfString:@"=\n" withString:@""] ;

В противном случае последний шаг завершается ошибкой из-за несбалансированного «%» в конце строки.

person Wyllys    schedule 24.09.2012

Я ничего не знаю об iPhone, но большинство библиотек обработки электронной почты будут содержать функции для этого, поскольку именно в электронной почте используется этот формат. Я предлагаю искать функции типа декодирования MIME, подобные тем, которые находятся на введите ссылку описание здесь.

Подход к более ранним плакатам также кажется мне подходящим - я чувствую, что он слишком самоуничижительно описывает его как хакерский :)

person Matt T    schedule 14.02.2012

См. рабочее решение, которое принимает строки, содержащие кавычки, и разрешает эти графемы. Единственное, на что вы должны обратить внимание, это кодировка (этот ответ основан на UTF8, его можно легко переключить на любой другой): https://stackoverflow.com/a/32903103/2799410

person Arthur Gevorkyan    schedule 02.10.2015