2013-07-26 27 views
15

Say mam:Node.js/Express - Jak ustawić kodowanie znaków odpowiedzi?

app.get('/json', function(req, res) { 
    res.set({ 
     'content-type': 'application/json' 
    }).send('{"status": "0"}'); 
}); 

Próbuję wysłać odpowiedź jako UTF-8 z następujących bez powodzenia:

app.get('/json', function(req, res) { 
    // From Node.js Official Doc 
    // http://nodejs.org/api/http.html#http_http_request_options_callback 
    res.setEncoding('utf8'); 

    res.set({ 
     'content-type': 'application/json' 
    }).send('{"status": "0"}'); 
}); 

Jaki jest prawidłowy sposób ustawić kodowanie znaków Ekspresowe ?

+3

co jest nie tak z robieniem 'res.json ({" status ":" 0 "});'? – mkoryak

+0

Ponieważ nie wiedziałem o tym - dzięki! – Kay

+0

najpierw przeczytaj dokument, a następnie kod;) – mkoryak

Odpowiedz

8

Zastosowanie res.charset: http://expressjs.com/api.html#res.charset

res.charset = 'value'; 
res.send('some html'); 
// => Content-Type: text/html; charset=value 

Jednak JSON jest UTF-8 jest domyślnie, więc nie ma potrzeby ustawiania czegokolwiek.

+2

To się zmieniło dla Express 4. Zobacz tutaj: https://github.com/visionmedia/express/wiki/Migrating%20from%203.x%20to%204.x#rescharset – Deiwin

+1

Przeglądarka internetowa niekoniecznie interpretuje JSON jako UTF-8, gdy przeglądasz go jako tekst. Podczas debugowania aplikacji może być szalenie mylące. Ustawienie res.charSet jest nadal dobrym pomysłem. – cleong

+1

Uzgodniono z @Deiwin. Konieczne jest określenie zestawu znaków. Nie będzie on domyślnie interpretowany jako UTF-8. Rozwiązałem mój problem w moim przypadku. – Saeger

1

Mając podobne problemy Zbieram szwedzkie znaki z bazy danych i wyprowadzam je jako obiekt JSON, węzeł nie obchodzi, czy json musi być UTF-8 czy nie, gdy znaki z bazy danych nie są w UTF- 8 .. Zakładając, że "nie musisz niczego ustawiać" jest fałszywe. W zależności od tego, z jakich zestawów znaków korzystasz.

+0

Naprawdę nie jest to odpowiedź, ale komentarz do odpowiedzi @ dankohna. – robertklep

15

prawdopodobnie zechcesz jawnie dodać charset do końca swojej treści typu ciąg, jeśli okaże się to nie jest ustawiony już przez Express:

res.set({ 'content-type': 'application/json; charset=utf-8' }) 

charset jest nie zawsze ustawiony automagicznie i musi być ustawiony, aby działał poprawnie wszędzie (np. Ze wszystkimi przeglądarkami i wszystkimi bibliotekami ajax) lub można uruchomić kodowanie błędów.

in Express 4.x specjalnie Odkryłam, że w zależności od obiektu, który próbuje wrócić, to normalnie automatycznie powraca z content-type: application/json; charset=utf-8 kiedy zadzwonić res.json(someObject), jednak nie zawsze.

Wywołanie res.json() na niektórych obiektach może zwrócić content-type: application/json (tj. Bez kodowania zestawu znaków!). Nie jestem do końca pewien, co to powoduje, poza tym, że chodzi o konkretny zwracany obiekt.

Zauważyłem to tylko z powodu zautomatyzowanych testów, które wyraźnie sprawdziły nagłówki i okazało się, że brakowało deklaracji zestawu znaków w niektórych odpowiedziach (mimo że typ zawartości wciąż był application/json).

+1

"zestaw znaków" powinien być używany tylko w zasobach text/*. "application/json" jest z definicji UTF-8; nie trzeba go określać. –

+0

@RichRemer Zgodnie z RFC 'application/json' _should_ powinno zawsze być UTF (w szczególności domyślnie UTF-8) i _shouldn't_ ma właściwość charset, ale w praktyce, jeśli go nie ustawisz, wielu użytkowników zmieni wynik [ w tym niektóre przeglądarki] (http://stackoverflow.com/questions/25267649/why-do-some-browsers-seem-to-require-a-utf-8-charset-on-json-data-for-display), dlatego jest to powszechny wzorzec. –

+1

Nawet jeśli istnieją klienci, którzy dławią się tym, pojawia się problem z dopasowaniem klientów, ponieważ nie powinni oczekiwać, że usunie się zestaw znaków z aplikacji/* typu nośnika. Lepiej przestać używać zepsutych klientów niż przerwać wszystkie działające. –

Powiązane problemy