我当前的应用程序开发存在一个奇怪的问题。我的应用程序的目的是通过 NSURLSConnection 接收几个 xhtml 网站(是的,没有 ASIHTTPRequest 框架),将它们保存在一个数组中,然后通过 NSURLConnection 将它们发布到一个网络服务,它会为我解析一些信息。
问题:我遇到了非常奇怪的编码问题并尝试了很多解决方法。
接收xhtml网站:
(void)connection:(CustomURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef) [response textEncodingName]);
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
[lastSearch.dataObjectsEncoding setObject:[response textEncodingName] forKey:connection.tag ];
[receivedData setLength:0];}
之后我处理数据并希望将其发送到网络服务。为此我做了一些准备:
方法一:
NSMutableString *data = [[NSMutableString alloc] initWithData:theData encoding:NSASCIIStringEncoding];
NSArray *escapeChars = [NSArray arrayWithObjects: @"€", @"\n", @";" , @"/" , @"?" , @":" ,
@"@" , @"&" , @"=" , @"+" ,
@"$" , @"," , @"[" , @"]",
@"#", @"!", @"'", @"(",
@")", @"*", nil];
NSArray *replaceChars = [NSArray arrayWithObjects: @"%E2%82%AC", @"", @"%3B" , @"%2F" , @"%3F" ,
@"%3A" , @"%40" , @"%26" ,
@"%3D" , @"%2B" , @"%24" ,
@"%2C" , @"%5B" , @"%5D",
@"%23", @"%21", @"%27",
@"%28", @"%29", @"%2A", nil];
int len = [escapeChars count];
int i;
for(i = 0; i < len; i++)
{
[data replaceOccurrencesOfString: [escapeChars objectAtIndex:i]
withString:[replaceChars objectAtIndex:i]
options:NSLiteralSearch
range:NSMakeRange(0, [data length])];
}
方法二:
NSMutableString *data = [[NSMutableString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
方法3:
CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef) [lastSearchParam.dataObjectsEncoding objectForKey:key]);
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
NSMutableString *data = [[NSMutableString alloc] initWithData:theData encoding: encoding];
方法四:
NSString *data = [[NSString alloc] initWithBytes:theData length:[theData length] encoding:NSUTF8StringEncoding];
方法5:
NSString *data2 = [data stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
添加一些东西后,我想将收到的 XHTML HTTP POST 到 web 服务。为了对整个参数和接收到的数据进行编码,我将所有内容添加到一个大字符串中并执行
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
大多数网站都是UTF-8。所以我首先尝试了“方法2”。如果我 NSLog 整个接收到的数据,一切似乎都很好,我可以查看正确的 HTML 源代码,即使是 € 符号也能正确显示。但是如果我将 HTTP POST 传输到 Web 服务,Web 服务不会接收到所有 XHTML。一些特殊字符似乎会中断传输,例如“;” 符号。
所以我搜索了互联网并想出了“方法 1”,将收到的 xhtml 网站解析为 ASCII 并进行一些自制的特殊字符对话 - 这适用于大多数标志,但例如“€”不起作用并且不正确由网络服务接收。但在这种情况下,一切都转移到了网络服务上——但遗憾的是字符错误。
下一次尝试是“方法 3”,我在接收网站时保存了网站的编码,并在以后使用该信息。但这里存在与 UTF8 编码相同的问题:传输被一些特殊字符中断...
“方法 4”和“方法 5”也不好用..
问题:为什么在我的 HTTP POST 到 Web 服务期间传输中断?