iphone: кодировка nsdata после поиска - почему так странно? - PullRequest
1 голос
/ 18 мая 2011

У меня странная проблема с моей текущей разработкой приложения.Цель моего приложения - получить несколько веб-сайтов xhtml через NSURLSConnection (да, без инфраструктуры 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];}

После этого я работаю с данными и хочу отправить их в веб-службу.для этого я делаю некоторые приготовления:

метод 1:

    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])];
}

метод 2:

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];

метод 4:

NSString *data = [[NSString alloc] initWithBytes:theData length:[theData length] encoding:NSUTF8StringEncoding];

метод 5:

NSString *data2 = [data stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

после того, как я добавил кое-что, что я хочу, HTTP POST полученного XHTML к веб-сервису.чтобы закодировать все параметры и полученные данные, я добавляю все в большую строку и делаю

NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

, большинство сайтов в UTF-8.поэтому я впервые попробовал «метод 2».если я NSLog все полученные данные, все выглядит нормально, я могу просмотреть правильный исходный код HTML, даже знак € отображается правильно.но если я передаю HTTP POST в веб-сервис, не весь XHTML получен веб-сервисом.некоторые специальные символы, кажется, нарушают передачу, например, ";"sign.

, поэтому я искал в Интернете и нашел «метод 1», проанализировал полученные веб-сайты xhtml в ASCII и провел специальный самодельный разговор с символами - это работало для большинства знаков, но, например, «€»не работает и не был правильно получен веб-службой.но в этом случае все перешло к веб-сервису - но, к сожалению, с неправильными символами.

Следующей попыткой был «метод 3», я сохранил кодирование сайтов при их получении и позже использовал эту информацию.но здесь была та же проблема, что и с кодировкой UTF8: передача прерывалась некоторыми специальными символами ...

"метод 4" и "метод 5" не работали также ..

вопрос: почему прерывается передача во время моего HTTP POST к веб-службе?

...