2013-07-08 3 views
2


Я не знаю, является ли это проблемой 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 и четыре символы отсутствуют. Если я добавлю другое место с двумя умляутами, еще два символа будут отсутствовать.

Я предполагаю, что тип контента установлен неправильно, но я не уверен, что мне нужно делать.

+0

Строка JSON в вашем вопросе есть 315 символов (не 215). Поскольку каждый umlaut кодируется как 2 байта UTF-8, длина содержимого должна быть 319. –

+0

извините, что исходная строка, которую я посылаю, является: '[{" _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}] 'Я отформатировал его для лучшей читаемости. –

+0

Тогда ваша строка имеет 231 байт. Что возвращает ваш JS-оператор 'body.length'? Количество * символов * или количество байтов (маловероятно)? Вероятно, было бы лучше убедиться, что вы задаете в байтах массив байтов, а не строку. – CouchDeveloper

ответ

3

Используйте это для правильной длины UTF-8:

new Buffer(body).length 
+0

Ницца! И кодировка по умолчанию UTF-8;) Я не OP, но не было бы лучше установить экземпляр Buffer в качестве тела запроса? Требуется также заголовок Content-Length * явно *? – CouchDeveloper

+0

Спасибо. Вам придется преобразовать буфер обратно в String (toString ('utf-8')), поэтому нет никакой разницы. И да, из моего опыта действительно нужен заголовок Content-Length. – joewhite86

+0

Это то, что я искал. спасибо –

Смежные вопросы