1

現在のアプリ開発に奇妙な問題があります。私のアプリの目的は、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 中に送信が中断されるのはなぜですか?

4

0 に答える 0