gpt4 book ai didi

objective-c - 在 Objective-C 中解码文字编码的 Content-Disposition 头文件名

转载 作者:行者123 更新时间:2023-12-01 17:02:39 24 4
gpt4 key购买 nike

我正在尝试从 content-disposition header 中检索无法以 ASCII 表示的文件名。

此文件名是文字编码的。下面是编码后的文件名:

=?UTF-8?Q?=C3=ABst=C3=A9_=C3=A9_=C3=BAm_n=C3=B4m=C3=A9?= =?UTF-8?Q?_a=C3=A7ent=C3= BAad=C3=B5.xlsx?=

如何获取解码后的文件名(实际上是“ësté é úm nômé açentúadõ.xlsx”)?

PS:我正在寻找一个Objective-C实现。

最佳答案

你可能想搜索一个 MIME 处理框架,但是我在网上搜索并没有找到任何东西,所以....

我在网上找不到一个例子,所以我只是在这里展示算法。这不是最好的例子,因为我做了一个很大的假设。那就是字符串始终是 UTF-8 Q 编码的。

Q 编码类似于 URL 编码(percent-encoding),Foundation 的 NSString已经支持解码。解码时唯一(实际)的区别(编码时有更大的区别)是 %编码是 =而是编码。

然后是导入和导出的东西。每个编码 block 的格式为 =?charset-name?encoding-type? ... encoded string here ... ?= .您应该真正阅读字符集名称是否使用该编码,并且您应该真正阅读编码类型,因为它可能是“Q”或“B”(Base64)。

此示例仅适用于 Q 编码(quoted-printable 的子集)。您应该能够轻松地对其进行修改以处理不同的字符集并处理 Base64 编码。

#import <Foundation/Foundation.h>

int main(void) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSString *encodedString = @"=?UTF-8?Q?=C3=ABst=C3=A9_=C3=A9_=C3=BAm_n=C3=B4m=C3=A9?= =?UTF-8?Q?_a=C3=A7ent=C3=BAad=C3=B5.xlsx?=";
NSScanner *scanner = [NSScanner scannerWithString:encodedString];
NSString *buf = nil;
NSMutableString *decodedString = [[NSMutableString alloc] init];

while ([scanner scanString:@"=?UTF-8?Q?" intoString:NULL]
|| ([scanner scanUpToString:@"=?UTF-8?Q?" intoString:&buf] && [scanner scanString:@"=?UTF-8?Q?" intoString:NULL])) {
if (buf != nil) {
[decodedString appendString:buf];
}

buf = nil;

NSString *encodedRange;

if (![scanner scanUpToString:@"?=" intoString:&encodedRange]) {
break; // Invalid encoding
}

[scanner scanString:@"?=" intoString:NULL]; // Skip the terminating "?="

// Decode the encoded portion (naively using UTF-8 and assuming it really is Q encoded)
// I'm doing this really naively, but it should work

// Firstly I'm encoding % signs so I can cheat and turn this into a URL-encoded string, which NSString can decode
encodedRange = [encodedRange stringByReplacingOccurrencesOfString:@"%" withString:@"=25"];

// Turn this into a URL-encoded string
encodedRange = [encodedRange stringByReplacingOccurrencesOfString:@"=" withString:@"%"];

// Remove the underscores
encodedRange = [encodedRange stringByReplacingOccurrencesOfString:@"_" withString:@" "];

[decodedString appendString:[encodedRange stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}

NSLog(@"Decoded string = %@", decodedString);

[decodedString release];

[pool drain];

return 0;
}

这输出:

chrisbook-pro:~ chris$ ./qp-decode 2010-12-01 18:54:42.903 qp-decode[9643:903] Decoded string = ësté é úm nômé açentúadõ.xlsx

关于objective-c - 在 Objective-C 中解码文字编码的 Content-Disposition 头文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4321484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com