1

我当前的应用程序开发存在一个奇怪的问题。我的应用程序的目的是通过 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 服务期间传输中断?

4

0 回答 0