Javascript:导入模块会改变其中字符串的编码吗?
我正在用Javascript(使用Node.js和Express)编写一些简单的web应用程序,我刚刚遇到了一个看起来有些奇怪的情况。嗯,我对这门语言整体来说是比较新的,所以可能这并不少见,或者我可能会犯一些基本的错误 无论如何,我刚刚意识到,在同一个模块中声明的字符串与在不同模块中声明的字符串(并通过“require”语句导入)的行为不同。例如,如果我将此代码发送到一个简单的模板('index.hbs'),该模板只呈现并显示'str'的值:Javascript:导入模块会改变其中字符串的编码吗?,javascript,node.js,character-encoding,Javascript,Node.js,Character Encoding,我正在用Javascript(使用Node.js和Express)编写一些简单的web应用程序,我刚刚遇到了一个看起来有些奇怪的情况。嗯,我对这门语言整体来说是比较新的,所以可能这并不少见,或者我可能会犯一些基本的错误 无论如何,我刚刚意识到,在同一个模块中声明的字符串与在不同模块中声明的字符串(并通过“require”语句导入)的行为不同。例如,如果我将此代码发送到一个简单的模板('index.hbs'),该模板只呈现并显示'str'的值: app.get('/', function (req
app.get('/', function (request, response) {
response.render('index.hbs', {
str: 'Français'
});
});
浏览器以utf-8格式正确显示结果:
法国
但如果我将该字符串放在另一个模块中,例如:
其他.js
module.exports = 'Français';
并从主函数调用它:
app.get('/', function (request, response) {
response.render('index.hbs', {
str: require('./other.js')
});
});
然后浏览器无法读取utf-8中的特殊字符,导致:
弗兰�人工智能
因此,如果我理解正确,在代码从一个模块导入到另一个模块的过程中,编码发生了变化。这正常吗?解决这个问题的最佳方法是什么(即,使来自其他模块的字符串保留在utf-8中)?好的,正如用户Jonathan Lonowski所指出的,发生的情况是文件不在utf-8中,因此导入声明为文本的字符串(在本例中为other.js)在这些文件的自身编码中就是这样做的
解决此问题就像将所有代码文件的编码更改为utf-8一样简单,因此,当其他地方需要字符串(或包含字符串的对象)时,编码仍为utf-8。确保服务器使用正确的MIME头(您可以使用浏览器开发工具进行检查)您可以使用
decodeURIComponent
从console.log(require('./other'))
服务器端看到什么输出来尝试字符串?如果控制台也显示�
对于ç
,检查保存other.js
的文件编码。Pointy:似乎字符集设置为utf-8。此外,我发现奇怪的是,如果我使用在同一模块中声明的字符串,它的工作方式与在不同模块中声明的相同字符串不同(这使得在导入过程中javascript代码本身似乎发生了一些编码更改)。Jonathan Lonowski:我在Windows上使用GitBash控制台,无论哪种方式,它都会为非ascii字符显示“?”。但我认为你是对的,其他文件可能是用非utf8编码的。我会检查一下。有一种方法可以修复JS本身的错误编码,但是修复文件要简单得多。。。