NSURLResponse的suggestedFilename中文乱码问题

NSURLResponse的suggestedFilename中文乱码问题,第1张

概述在使用NSURLConnection下载文件时,如果通过NSURLResponse 类的 suggestedFilename 方法获取文件名, 中文的文件名会遇到乱码问题,这是因为suggestedFilename是解析 HTTP 首部中的 Content-Disposition 域里的 filename 部分实现的, 而很多中文网站此处都是用的GB码,如下面这个头部: 其中的ce d2 c3 c

在使用NSURLConnection下载文件时,如果通过NSURLResponse 类的 suggestedFilename 方法获取文件名,

中文的文件名会遇到乱码问题,这是因为suggestedFilename是解析 http 首部中的 Content-Disposition 域里的 filename 部分实现的,

而很多中文网站此处都是用的GB码,如下面这个头部:


其中的ce d2 c3 c7就是中文“我们”的GBK码,但是代码中取出来却发现是乱码,如下


其实,这是因为NSURLResponse 把 Content-disposition 中的 filename 当成 ASCII 处理了,怪不得会乱码。

可是也不能怪 NSURLResponse,毕竟服务器没有提供任何编码的信息,而 RFC 2183 中也明确说明,不应该在 filename 中使用任何 ASCII 以外的字符,用了就是后果自负了。

有篇文章也提到了这个问题,Cocoa 的 NSString 解码错误处理,但是它的解决方法并不正确,

内存中的值并不是gbk码,

经过多次尝试,终于找到正确解码的方法,

Nsstring *filename,*str;

@H_301_56@ const char *byte = NulL;


filename = [response suggestedfilename];

byte = [filename cStringUsingEnCoding:NSISOlatin1StringEnCoding];

nsstringencoding enc = CFStringConvertEnCodingTonsstringencoding(kcfStringEnCodingGB_18030_2000);

str = [[Nsstring allocinitWithCString:byte enCoding: enc]; //如是utf,此处应改为NSUTF8StringEnCoding




另附
iphone中编码转换方法 我们可以使用以下方法进行编码转换 Nsstring* str2 = [Nsstring stringWithCString:str1 enCoding:enc1]; 再调用Nsstring的cStringUsingEnCoding:enc2实现从enc1到enc2的转换 但是获取enc枚举值是个难题 1. Nsstring.h中只定义了以下编码值 enum {     NSASCIIStringEnCoding = 1,                /* 0..127 only */     NSNEXTSTEPStringEnCoding = 2,    NSJapaneseEUCStringEnCoding = 3,    NSUTF8StringEnCoding = 4,    NSISOlatin1StringEnCoding = 5,    NSSymbolStringEnCoding = 6,    NSNonLossyASCIIStringEnCoding = 7,    NSShiftJIsstringEnCoding = 8,          /* kcfStringEnCodingDOSJapanese */     NSISolatin2StringEnCoding = 9,    NSUnicodeStringEnCoding = 10,    NSwindowsCP1251StringEnCoding = 11,    /* Cyrillic; same as AdobeStandardCyrillic */     NSwindowsCP1252StringEnCoding = 12,    /* Winlatin1 */     NSwindowsCP1253StringEnCoding = 13,    /* Greek */     NSwindowsCP1254StringEnCoding = 14,    /* Turkish */     NSwindowsCP1250StringEnCoding = 15,    /* WinLatin2 */     NSISO2022JPStringEnCoding = 21,        /* ISO 2022 Japanese enCoding for e-mail */     NSMacOSRomanStringEnCoding = 30,    NSUTF16StringEnCoding = NSUnicodeStringEnCoding,      /* An alias for NSUnicodeStringEnCoding */ #if MAC_OS_X_VERSION_10_4 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_2_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED     NSUTF16BigEndianStringEnCoding = 0x90000100,          /* NSUTF16StringEnCoding enCoding with explicit endianness specifIEd */     NSUTF16littleEndianStringEnCoding = 0x94000100,       /* NSUTF16StringEnCoding enCoding with explicit endianness specifIEd */     NSUTF32StringEnCoding = 0x8c000100,                        NSUTF32BigEndianStringEnCoding = 0x98000100,          /* NSUTF32StringEnCoding enCoding with explicit endianness specifIEd */     NSUTF32littleEndianStringEnCoding = 0x9c000100        /* NSUTF32StringEnCoding enCoding with explicit endianness specifIEd */ #endif }; 难道iphone中中文还不支持?不会吧? 2. iphone中肯定是支持中文的,只是Nsstring中没有定义这个枚举值,我们可以通过两种方法获得这个枚举值 第一个方法是通过CFStringConvertEnCodingTonsstringencoding 比如:nsstringencoding enc = CFStringConvertEnCodingTonsstringencoding(kcfStringEnCodingGB_18030_2000); Nsstring* str2 = [Nsstring stringWithCString:str1 enCoding:enc]; 全部的kcfStringEnCoding定义参考CFStringEnCodingExt.h 另外CFStringConvertIANACharSetnameToEnCoding也很有用 3. 另外一种方法是通过 const nsstringencoding *enCodings = [Nsstring availableStringEnCodings]; NSMutableString *str = [[NSMutableString alloc] init]; nsstringencoding enCoding; while ((enCoding = *enCodings++) != 0) {          [str appendFormat: @"%@ === %in",[Nsstring localizednameOfStringEnCoding:enCoding],enCoding]; } 然后打印str数组,你就可以知道每一个enCoding的枚举值为多少了,比如中文的为-2147482063 总结

以上是内存溢出为你收集整理的NSURLResponse的suggestedFilename中文乱码问题全部内容,希望文章能够帮你解决NSURLResponse的suggestedFilename中文乱码问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1061251.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存