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