web-dev-qa-db-fra.com

Node.js / Express - Comment définir l'encodage des caractères de réponse?

Dis que j'ai:

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

J'essaie d'envoyer la réponse au format UTF-8 sans succès:

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

Quelle est la bonne façon de définir l'encodage des caractères dans Express?

20
gsklee

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

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

Cependant, JSON est UTF-8 par défaut, vous n'avez donc pas besoin de définir quoi que ce soit.

9
Dan Kohn

Vous souhaiterez probablement ajouter explicitement un jeu de caractères à la fin de votre chaîne de type de contenu si vous trouvez qu'il n'est pas déjà défini par Express:

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

Le jeu de caractères est pas toujours défini automatiquement et doit être défini pour fonctionner correctement partout (c'est-à-dire avec tous les navigateurs et toutes les bibliothèques ajax) ou vous pouvez rencontrer des bogues d'encodage.

Dans Express 4.x en particulier, j'ai trouvé qu'en fonction de l'objet que vous essayez de renvoyer, il normalement revient automatiquement avec content-type: application/json; charset=utf-8 Lorsque vous appelez res.json(someObject), mais pas toujours.

Lors de l'appel de res.json() sur certains objets, il peut retourner content-type: application/json (C'est-à-dire sans l'encodage du jeu de caractères!). Je ne suis pas vraiment sûr de ce qui déclenche cela, à part qu'il s'agit de l'objet spécifique renvoyé.

Je ne l'ai remarqué qu'à cause de tests automatisés qui ont explicitement vérifié les en-têtes et ont constaté qu'il manquait la déclaration charset sur certaines réponses (même si le type de contenu était toujours application/json).

23
Iain Collins

Ayant des problèmes similaires, je collecte des caractères suédois à partir d'une base de données et les exporte en tant qu'objet JSON, le nœud ne se soucie pas vraiment si json doit être UTF-8 ou non lorsque les caractères de la base de données ne sont pas en UTF-8. supposer que "vous n'avez rien à régler" est faux. Selon les jeux de caractères avec lesquels vous travaillez.

2
Moronicsmurf

Cela a fonctionné pour moi

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

Avant de vous donner la peine de définir manuellement les paramètres d'en-tête, vérifiez ce que votre serveur envoie déjà par défaut. Dans mon cas, j'utilise une instance Node.js "sans serveur" fournie par le cloud. Apparemment, ce sont généralement des frontaux avec NGINX qui, je suppose, définissent certains de ces éléments en fonction des paramètres par défaut. ... je n'avais pas besoin de res.set rien du tout. Certes, je rends du HTML, ... dis juste - avant de réparer, assurez-vous qu'il est cassé.

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 
1
Ron Royston