2013-05-11 55 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