Node.js/Express - Как установить кодировку символов ответа?

Скажем, я получил:

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

Я пытаюсь отправить ответ как UTF-8 со следующим без успеха:

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"}');
});

Каков правильный способ установки кодировки символов в Express?

Ответы

Ответ 1

Используйте res.charset: http://expressjs.com/api.html#res.charset

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

Однако JSON по умолчанию является UTF-8, поэтому вам не нужно ничего устанавливать.

Ответ 2

Возможно, вы захотите явно добавить кодировку в конец вашей строки типа контента, если вы обнаружите, что она не была уже установлена Express:

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

Кодировка не всегда устанавливается автоматически и должна быть настроена на корректную работу везде (т.е. Со всеми браузерами и всеми библиотеками ajax), иначе вы можете столкнуться с ошибками кодирования.

В частности, в Express 4.x я обнаружил, что в зависимости от объекта, который вы пытаетесь вернуть, он обычно автоматически возвращается с content-type: application/json; charset=utf-8 content-type: application/json; charset=utf-8 когда вы вызываете res.json(someObject), но не всегда.

При вызове res.json() для некоторых объектов он может возвращать content-type: application/json (т.е. без кодировки charset!). На самом деле я не уверен, что это вызывает, кроме как что-то о возвращаемом конкретном объекте.

Я заметил это только из-за автоматических тестов, которые явно проверили заголовки и обнаружили, что в некоторых ответах пропущено объявление charset (хотя тип контента все еще был application/json).

Ответ 3

Имея аналогичные проблемы, я собираю шведские символы из базы данных и выводя их как объект JSON, node не имеет значения, должен ли json быть UTF-8 или нет, когда символы из базы данных не находятся в UTF -8.. Так что предположение, что "вам не нужно ничего устанавливать", является ложным. В зависимости от того, с какими кодировками вы работаете.

Ответ 4

Прежде чем приступить к настройке параметров заголовка вручную, проверьте, что ваш сервер уже отправляет по умолчанию. В моем случае я использую "серверный" облачный экземпляр Node.js. По-видимому, это, как правило, внешние интерфейсы с NGINX, которые, как я полагаю, устанавливают некоторые вещи на основе настроек по умолчанию.... Мне не нужно было ничего res.set. Конечно, я возвращаю HTML,... просто скажу - прежде чем исправиться, убедитесь, что он сломался.

accept-ranges: bytes
accept-ranges: bytes
cache-control: private
content-encoding: gzip
content-type: text/html; charset=utf-8
date: Fri, 21 Dec 2018 21:40:37 GMT
etag: W/"83-xwilN/BBLLLAAAHHH/0NBLAH0U"
function-execution-id: 5thvkjd4wwru
server: nginx
status: 200
vary: accept-encoding, cookie, authorization
via: 1.1 varnish
x-cache: MISS
x-cache-hits: 0
x-cloud-trace-context: 18c611BBBBLLLLAAAHHH9594d9;o=1
x-powered-by: Express
x-served-by: cache-dfw18631-DFW
x-timer: S15BBLLLAAHHH.913934,VS0,VE3404 

Ответ 5

Это сработало для меня

res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});