我正在寻找一种解码引用打印文件的方法。
引用的可打印文件用于阿拉伯字符,如下所示:
=D8=B3=D8=B9=D8=A7=D8=AF
我需要将其转换为字符串,并将其存储或显示..
我在stackoverflow上看到过相反的帖子(编码),但找不到解码。
我正在寻找一种解码引用打印文件的方法。
引用的可打印文件用于阿拉伯字符,如下所示:
=D8=B3=D8=B9=D8=A7=D8=AF
我需要将其转换为字符串,并将其存储或显示..
我在stackoverflow上看到过相反的帖子(编码),但找不到解码。
嗯,这有点 hacky,但你可以=
用一个字符替换%
字符并使用 NSString 的stringByReplacingPercentEscapesUsingEncoding:
方法。否则,您基本上可以在 = 字符上拆分字符串,将每个元素转换为字节值(使用 NSScanner 很容易完成),将字节值放入 C 数组中,然后使用 NSString 的initWithBytes:length:encoding:
方法。
请注意,您的示例在技术上不是带引号的可打印格式,它指定带引号的可打印是由一个=
字符后跟两个十六进制数字组成的三个字符序列。
在我的情况下,我来自 EML ...... bensnider 的回答效果很好......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 对象!
Bensnider 的回答是正确的,简单的方法。
您需要将“=”替换为“%”
NSString *s = @"%D8%B3%D8%B9%D8%A7%D8%AF";
NSString *s2 = [s stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
s2 存储了“سعاد”,这是有道理的,所以这应该可以直接工作而无需破解
在某些情况下,行尾不是“=\r\n”,而只是“=\n”,在这种情况下,您需要另一个步骤: decodedString = [self stringByReplacingOccurrencesOfString:@"=\n" withString:@""] ;
否则,由于行尾的“%”不平衡,最后一步会失败。
我对 iPhone 一无所知,但大多数电子邮件处理库都会包含执行此操作的函数,因为电子邮件是使用这种格式的地方。我建议搜索 MIME 解码类型的函数,类似于enter link description here中的函数。
早期的海报方法对我来说似乎也很好——我觉得他把它描述为 hacky 有点太自嘲了:)
请参阅一个工作解决方案,该解决方案采用包含引用可打印的字符串并解析这些字素。您唯一应该注意的是编码(该答案基于 UTF8,可以轻松切换到任何其他):https ://stackoverflow.com/a/32903103/2799410