UTF8字符出现在windows-1252上,ExpressJS在Electron上运行

时间:2016-12-20 07:21:34

标签: express encoding electron

一点介绍 - 我正在研究的(想要的)软件是一个基于Github Electron构建的桌面应用程序。它设计有两个模块 - 一个UI和一个带有API的后端,第二个"生活"在隐藏的浏览器窗口中并在ExpressJS上运行。想法是UI和API通过HTTP进行通信,以便在需要时可以将它们分离。所有文件都是UTF-8。

现在问题本身 - 主要API路线如下:

router.get('/', (request, result) => {
  let message = 'Здрасти, коко!';

  console.log('Answering with ' + message);
  result.json(message);
});

当被调用时(来自浏览器或邮递员,或其他什么),答案如下:

{"message":"ЗдраÑти, коко!"}

...带有这些标题:

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 64
ETag: W/"40-3JawFDiTNEinvN6xFO6T9g"
Date: Tue, 20 Dec 2016 06:47:53 GMT
Connection: keep-alive

使用2cyr工具,我发现源编码是UTF-8,但它只能作为windows-1252正确显示,这让我很困惑。

为了缩小可能性,我将console.log()添加到路由处理程序中(对我来说有点令人惊讶)我得到了相同的"破坏"导致Chromium调试器。我怀疑文件的编码,但这就是我得到的:

Petars-Mac:api petar$ file -I api.js
api.js: text/x-c++; charset=utf-8

我想到的最后一件事实际上是将API与Electron解耦。当我在带节点的终端中运行它时,我实际上得到了正确的结果 - 终端的日志消息和浏览器中的JSON答案。

我做错了什么以及我可以进行哪些进一步的调试?

1 个答案:

答案 0 :(得分:2)

所以我们在Electron存储库中发布问题之前就去了 - 这是我在这种情况下可能想象的最愚蠢的错误。

TL; DR:

<meta charset="utf-8">

我认为为后端打开第二个浏览器窗口并放入一些运行在其中的JavaScript就足够了。我忘记的是它实际上仍然是一个浏览器窗口,因此只需要一点点HTML就可以让它知道它提供的是UTF-8内容。

也许不是我,也许我是正确的期望Express通过HTTP服务UTF-8但不是。无论如何,这一切现在都有效。