2013-05-11 71 views
0

我想通过使用Json解析发送一个字符串到服务器。我的字符串包含许多特殊字符,如ó,æ,ø,å等等。当我发送数据到服务器没有任何特殊的字符时,它工作得很好,响应如预期。但是,如果甚至有一个特殊的字符,那么它在解析数据时会显示错误。 我使用下面的代码来解析JSON字符串: -在iOS中解析Json时的特殊字符。

NSURL *theURL = [NSURL URLWithString:urlToSendRequest]; 
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:theURL  cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0f]; 
NSData *requestData = [NSData dataWithBytes:[jsonContentToSend UTF8String] length:[jsonContentToSend length]]; 
[theRequest setHTTPMethod:@"POST"]; 
[theRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[theRequest setValue:@"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; 
[theRequest setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"]; 
[theRequest setHTTPBody: requestData]; 
NSURLResponse *theResponse = NULL; 
NSError *theError = NULL; 
NSData *theResponseData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&theResponse error:&theError]; 
NSString *data=[[NSString alloc]initWithData:theResponseData encoding:NSUTF8StringEncoding]; 
NSLog(@"url to send request= %@",urlToSendRequest); 
NSLog(@"jsoncontenttosend= %@",requestData); 
NSLog(@"response1111:-%@",data); 
return data; 

这里urlToSendRequest是URL和jsonContentToSend是我发送到服务器的特殊字符字符串。

回答

2

有一个错误,当您在

NSData *requestData = [NSData dataWithBytes:[jsonContentToSend UTF8String] length:[jsonContentToSend length]]; 

[jsonContentToSend length]创建POST数据的Unicode字符数,而不是字节的数UTF-8字符串。如果jsonContentToSend包含非ASCII字符,那么您的requestData将太短,仅包含JSON请求的截断部分。

您应该更换

NSData *requestData = [jsonContentToSend dataUsingEncoding:NSUTF8StringEncoding]; 
+0

谢谢马丁。非常感谢。这解决了我的问题。现在我正在得到所需的答复。 – 2013-05-14 06:22:08

0

处理这种情况的一个好方法是将值作为base64编码值发送,并在将其从JSON解析为数据结构(如String)之后,可以解码Base64字符串,并可以取回特殊字符而不会使用实际JSON失效

好运

+0

这一行,但我已经使用NSUTF8StringEncoding。不能NSUTF8StringEncoding处理特殊字符串? – 2013-05-11 12:06:44

+0

base64和utf8编码之间有显着的区别 – samfisher 2013-05-11 12:28:59

+0

** @ samfisher **是的我同意base64和utf8编码有显着的区别,但是NSUTF8StringEncoding足够强大来处理所有这些。感谢您的回复。 – 2013-05-14 06:50:30