2012-05-16 35 views
0

当我使用utf-8特殊字符(例如“Ö”)向我的web服务发送请求时,它将返回响应500“处理请求时出错”这就是我登录iOS应用程序。当发送utf-8时的响应

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{  
    NSError *error = nil; 

    dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:self.responseData error:&error]; 
    for (id key in dict) { 
     NSLog(@"%@=%@", key, [dict objectForKey:key]); 
    } 

如果我用简单的英语发送消息,它工作正常。

我不确定错误是在服务器端还是在应用程序本身。 这是我送我的JSON POST:

- (void)stringWithUrl:(NSURL *)url jsonReq:(NSString *)json{ 

    self.requestURL = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease]; 
    self.responseData = [NSData dataWithBytes:[json UTF8String] length:[json length]]; 


    [self.requestURL setHTTPMethod:@"POST"]; 
    [self.requestURL setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [self.requestURL setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [self.requestURL setValue:@"application/json" forHTTPHeaderField:@"UTF-8"]; 
    [self.requestURL setValue:[NSString stringWithFormat:@"%d", [self.responseData length]] forHTTPHeaderField:@"Content-Length"]; 
    [self.requestURL setHTTPBody: self.responseData]; 

这是怎样的Web服务的样子:

....  
[WebService(Namespace = "http://mypage.com/webservicesF")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    // To allow this Web Service to be called from script, using ASP.NET AJAX, 
    [System.Web.Script.Services.ScriptService] 
..... 
    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

回答

0

这line:

self.responseData = [NSData dataWithBytes:[json UTF8String] length:[json length]]; 

不正确。一个NSString的长度是UTF-16字符,而不是UTF-8字符。你可以这样做:

const char* utf8 = [json UTF8String]; 
self.responseData = [NSData dataWithBytes:utf8 length:strlen(utf8)]; 

但更好的方法是只具有字符串直接创建NSData,而无需通过C风格串去。

self.responseData = [json dataUsingEncoding:NSUTF8StringEncoding]; 
0

尝试之前编码发送某物像:

NSString *strEncode = [src stringByAddingPercentEscapesUsingEncoding:NSUnicodeStringEncoding];