从Node.js发送元音到iOS

我不知道这是一个Node.js还是一个iOS问题,但是当我尝试发送一个包含变音符号(ä,ö和ü)的JSON对象时,设置的内容长度似乎是错误的。

所以这是我的设置:

我的Node.js服务器通过以下方式发送数据:

[..mongodb request..].toArray(function(err, result) { res.setHeader('Content-Type', 'application/json'); var body = JSON.stringify(result); console.log(body); console.log(body.length); res.setHeader('charset', 'utf8'); res.setHeader('Content-Length', body.length); res.end(body); }); 

这产生以下对象:

 [ { "_id": "51da7eb5d5f9ad77302a26c6", "loc": [ 53.560994, 9.929796 ], "street": "Kühnehöfe 25", "time": 1373273781535 }, { "_id": "51da7eb9d5f9ad77302a26c7", "loc": [ 53.561899, 9.930203 ], "street": "Kühnehöfe 17", "time": 1373273785156 } ] 

其中(parsing为string)的长度为215.这也被设置为内容长度。

在我的iOS项目中,我有以下设置:

 -(void)serverRequest { // Initialize new mutable data NSMutableData *data = [[NSMutableData alloc] init]; self.receivedData = data; // Initialize URL that is going to be fetched. NSURL *url = [NSURL URLWithString:@"http://localhost:8000/getSpots"]; // Initialize a request from a URL NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[url standardizedURL]]; // Set HTTP method [request setHTTPMethod:@"POST"]; // Initialize post data NSDictionary* jsonDict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:coordinate.latitude], @"lat", [NSNumber numberWithFloat:coordinate.longitude], @"lng", accessToken, @"accessToken", nil];//dictionaryWithObjectsAndKeys:coord.latitude, nil] NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string error:&error]; // Set request content type we MUST set this value. [request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"content-type"]; // Set post data of request [request setHTTPBody:jsonData]; // Initialize a connection from request NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; self.connectionGetSpots = connection; // Start the connection [connection start]; } -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ [self.receivedData appendData:data]; NSLog(@"loading: %d, %lld", [self.receivedData length], dataSize); // Both 215 (correct) } -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ dataSize = [response expectedContentLength]; NSLog(@"dataSize: %lld", dataSize); // is 215 (correct) } -(void)connectionDidFinishLoading:(NSURLConnection *)connection{ NSString *responseData = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; NSLog(@"rD: %@, %d" ,responseData, [responseData length]); } 

connectionDidFinishLoading函数logging这个:

 [ { "_id": "51da7eb5d5f9ad77302a26c6", "loc": [ 53.560994, 9.929796 ], "street": "Kühnehöfe 25", "time": 1373273781535 }, { "_id": "51da7eb9d5f9ad77302a26c7", "loc": [ 53.561899, 9.930203 ], "street": "Kühnehöfe 17", "time": 13732737851 ,211 

正如你所看到的,JSON对象中有四个变音符,缺less四个字符。 如果我用两个变音器添加另一个位置,则会丢失两个字符。

我猜想内容types设置错了,但我不知道我必须做什么。

使用这个正确的UTF-8长度:

 new Buffer(body).length