你能将 php 函数quoted_printable_decode() 转换为基于 NSString 的 Objective-C 函数/类别方法吗?
-
20-08-2019 - |
题
在 http://php.net/quoted_printable_decode, ,我找到了使用 preg_replace 来做到这一点的方法。有人知道可以将普通 NSString 转换为 RFC 2045 第 6.7 节的代码吗?
提前致谢!
解决方案
有对可可都没法解码引用的可打印字符串,但你可以很容易地写自己的东西,如:
@interface NSString (QuotedPrintableStrings)
+(NSString*)stringWithQuotedPrintableString:(const char *)qpString;
@end
@implementation NSString (QuotedPrintableStrings)
+(NSString*)stringWithQuotedPrintableString:(const char *)qpString
{
const char *p = qpString;
char *ep, *utf8_string = malloc(strlen(qpString) * sizeof(char));
NSParameterAssert( utf8_string );
ep = utf8_string;
while( *p ) {
switch( *p ) {
case '=':
NSAssert1( *(p + 1) != 0 && *(p + 2) != 0, @"Malformed QP String: %s", qpString);
if( *(p + 1) != '\r' ) {
int i, byte[2];
for( i = 0; i < 2; i++ ) {
byte[i] = *(p + i + 1);
if( isdigit(byte[i]) )
byte[i] -= 0x30;
else
byte[i] -= 0x37;
NSAssert( byte[i] >= 0 && byte[i] < 16, @"bad encoded character");
}
*(ep++) = (char) (byte[0] << 4) | byte[1];
}
p += 3;
continue;
default:
*(ep++) = *(p++);
continue;
}
}
return [[[NSString alloc] initWithBytesNoCopy:utf8_string length:strlen(utf8_string) encoding:NSUTF8StringEncoding freeWhenDone:YES] autorelease];
}
@end
其他提示
对于其他正在寻找此功能的人来说, 杰森·可可的 答案确实很好,但有一个重要的错误。返回之前需要在 utf8_string 末尾添加一个空字符。因此,在 return 语句之前添加以下行 *ep = '\0';
这应该可以解决问题。另外,我将其修改为返回 NSData 对象而不是 NSString,因为解码后的字符串可能使用与 UTF-8 不同的字符编码。就像是 return [NSData dataWithBytes:(char *)utf8_string length:strlen(utf8_string)];
效果很好。然后调用方法可以使用适当的编码将返回的数据填充回 NSString 中。
不隶属于 StackOverflow