Я не знаю, является ли это проблемой Node.js или iOS, но когда я пытаюсь отправить объект JSON, содержащий umlauts (ä, ö и ü) установленная длина содержимого кажется неправильной.Отправить umlauts от Node.js до iOS
Так вот моя установка:
сервер My 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
}
]
Который (разобранный в виде строки) а длиной 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
функция регистрирует это:
[
{
"_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 и четыре символы отсутствуют. Если я добавлю другое место с двумя умляутами, еще два символа будут отсутствовать.
Я предполагаю, что тип контента установлен неправильно, но я не уверен, что мне нужно делать.
Строка JSON в вашем вопросе есть 315 символов (не 215). Поскольку каждый umlaut кодируется как 2 байта UTF-8, длина содержимого должна быть 319. –
извините, что исходная строка, которую я посылаю, является: '[{" _id ":" 51da7eb5d5f9ad77302a26c6 "," loc ": [53.560994,9.929796]," улица ":" Kühnehöfe 25 "," time ": 1373273781535}, {" _ id ":" 51da7eb9d5f9ad77302a26c7 "," loc ": [53.561899,9.930203]," улица ":" Kühnehöfe 17 "," time ": 1373273785156}] 'Я отформатировал его для лучшей читаемости. –
Тогда ваша строка имеет 231 байт. Что возвращает ваш JS-оператор 'body.length'? Количество * символов * или количество байтов (маловероятно)? Вероятно, было бы лучше убедиться, что вы задаете в байтах массив байтов, а не строку. – CouchDeveloper