带有德语变音符号的 NSJSONSerialization 异常
Posted
技术标签:
【中文标题】带有德语变音符号的 NSJSONSerialization 异常【英文标题】:NSJSONSerialization Exception with german umlaut 【发布时间】:2013-12-09 07:56:57 【问题描述】:我尝试将我的对象转换为 json 字符串,没有变音符号它工作正常,但是当我输入带有“ä”或“ü”的文本时,我收到此错误:
ExceptionType = "System.ArgumentException";
Message = "Ein ung\U00fcltiges Objekt wurde \U00fcbergeben. Erwartet wurde \":\" oder \"\".
这是我的代码:
-(Buchungsergebnis*)sendeBuchung:(NSString *)Buchung vomWebservice:(NSString *)WebServiceURL
//Erstellt einen Request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:WebServiceURL]];
[request setHTTPMethod: @"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSData *reqData = [NSData dataWithBytes:[Buchung UTF8String] length:[Buchung length]];
[request setHTTPBody:reqData];
NSURLResponse *response =[[NSURLResponse alloc]init];
NSError *error;
//Führt den Befehl aus
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (data ==nil)
NSLog(@"Login Error: %@",error);
return false;
NSMutableDictionary *dic = [[NSMutableDictionary alloc]init ];
dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSLog(@"%@",dic);
NSMutableDictionary *result = [[NSMutableDictionary alloc]init];
result = [dic objectForKey:@"d"] ;
Buchungsergebnis *ergebnis = [[Buchungsergebnis alloc]init];
ergebnis.result =[[result objectForKey:@"result"]boolValue];
ergebnis.message =[result objectForKey:@"message"];
return ergebnis;
这是json:
"thema":"用变音符号测试 \n\nÖffne die tür","personenanzahl":"4","vondatum":"17.12.2013 09:00","veranstalteremail":"asjgdl@dgs. de","bisdatum":"17.12.2013 10:30","dienstleistungen":[],"teilnehmer":[],"veranstaltertelefon":"","veranstalter":"blagojevic domenik","bestuhlungsid": "377","benutzername":"dbl"
我怎样才能防止这个错误?
【问题讨论】:
【参考方案1】:您的 JSON 是有效的(可以在 http://jsonlint.com 上进行测试)。
但这是有问题的:
NSData *reqData = [NSData dataWithBytes:[Buchung UTF8String] length:[Buchung length]];
因为[Buchung length]
返回字符串中(Unicode)字符的个数,
这与非 ASCII 字符(如变音符号)的 UTF-8 字节数 的数量不同。
更好用
NSData *reqData = [Buchung dataUsingEncoding:NSUTF8StringEncoding];
或者使用 NSJSONSerialization
创建 JSON,它会为您提供一个 NSData
对象
而不是字符串。
您可能还必须明确设置 HTTP 内容长度,我不确定是否这样 是必要的:
[request setValue:[NSString stringWithFormat:@"%d", [reqData length]] forHTTPHeaderField:@"Content-Length"];
【讨论】:
【参考方案2】:尝试使用: [NSJSONSerialization JSONObjectWithData:数据选项:NSJSONReadingMutableLeaves 错误:&error]; (使用 NSJSONReadingMutableLeaves 代替 kNilOptions)
我将它用于包含中文、西班牙文、印地语的数据。对我来说效果很好。
【讨论】:
以上是关于带有德语变音符号的 NSJSONSerialization 异常的主要内容,如果未能解决你的问题,请参考以下文章
带有德语变音符号的 iOS 上的 FacebookDisplayName
CakePHP 2.1:德语变音符号的 Sluggable 行为
Python2 / Windows7:打开包含德语变音符号的文件名