現在のアプリ開発に奇妙な問題があります。私のアプリの目的は、NSURLSConnection (はい、ASIHTTPRequest フレームワークはありません) を介していくつかの xhtml Web サイトを受信し、それらを配列に保存し、NSURLConnection を介して Web サービスに投稿し、情報を解析することです。
問題: 非常に奇妙なエンコーディングの問題があり、多くの回避策を試しました。
xhtml Web サイトの受信:
(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];}
その後、データを処理し、それを Web サービスに送信したいと考えています。そのため、いくつかの準備をします。
方法 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];
いくつかのものを追加した後、受信した XHTML を Web サービスに HTTP POST したい。パラメータ全体と受信データをエンコードするには、すべてを大きな文字列に追加して、
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
ほとんどの Web サイトは UTF-8 です。そこでまず「方法2」を試してみました。受信したデータ全体を NSLog すると、すべて問題ないように見えます。正しい HTML ソース コードを表示でき、€ 記号も正しく表示されます。しかし、HTTP POST を Web サービスに送信すると、Web サービスがすべての XHTML を受信するわけではありません。「;」などの一部の特殊文字が送信を中断しているようです。サイン。
インターネットを検索して、受け取った xhtml Web サイトを ASCII に解析し、自作の特殊文字の会話を行う「方法 1」を思いつきました。これはほとんどの記号で機能しましたが、たとえば「€」は機能せず、正しくもありませんWeb サービスによって受信されます。しかし、この場合、すべてが Web サービスに渡されましたが、悲しいことに間違った文字が含まれていました。
次の試行は「方法 3」でした。Web サイトのエンコードを受信中に保存し、後でその情報を使用しました。しかし、ここにはUTF8エンコーディングと同じ問題がありました.送信はいくつかの特殊文字によって中断されていました...
「方法4」と「方法5」もうまくいきませんでした..
質問: Web サービスへの HTTP POST 中に送信が中断されるのはなぜですか?