Javascript 根据客户端的不同,正则表达式的行为也不同

Javascript 根据客户端的不同,正则表达式的行为也不同,javascript,node.js,regex,Javascript,Node.js,Regex,我在node.js中有这个应用程序。用户上载pdf,服务器需要修改客户端文件名,使其仅包含字母数字字符和其他字符(冒号和点) 代码如下所示: console.log('document.fileName:',document.fileName); var temp = document.fileName.replace(/[^\w.:-]+/g, ""); console.log('temp:',temp); 现在,用我的Mac打开前端(角度),使用Chrome,我上传了文件名 åäö&

我在node.js中有这个应用程序。用户上载pdf,服务器需要修改客户端文件名,使其仅包含字母数字字符和其他字符(冒号和点)

代码如下所示:

console.log('document.fileName:',document.fileName);
var temp = document.fileName.replace(/[^\w.:-]+/g, "");
console.log('temp:',temp);
现在,用我的Mac打开前端(角度),使用Chrome,我上传了文件名

åäö&23^¨testarkönstigatäcken
我可以在服务器上的日志中看到:

document.fileName: åäö&23^¨testarkönstigatäcken
temp: aao23testarkonstigatacken
如您所见,它将“äåö”替换为“aao”。其他非字母数字字符被删除

但是,如果我对Safari浏览器做同样的事情,“äåö”将被剥离。在日志中显示此结果:

document.fileName: åäö&23^¨testarkönstigatäcken
temp: 23testarknstigatcken
在Firefox中做同样的事情时,我得到了与Chrome相同的结果,regex保留了“äåö”

当我在windows中执行同样的操作时,无论使用何种浏览器,非字母数字都会被剥离,不会被替换

所以,我想知道的是,服务器上的这个正则表达式如何可能依赖于客户机环境。
因为在所有情况下,它都收到相同的文件名。但根据客户端发出的请求,它的行为会有所不同。

我建议在向其提供regex之前对字符串进行规范化

这样做很容易:

var n = require('normalize');
console.log(n('Åland')) // Aland 

我希望这能有所帮助。

尝试测试
String.fromCharCode.apply(null,Array.from(function*(){for(let I=0;I<0x10000;++I){yield I}}())。match(/\w+/g)
在各种客户端上的作用。这将告诉您哪些(基本平面)字符被视为单词字符。您的文件名是否在同一个客户端中?如果没有,它们可能在控制台中显示为相同的,但即使您没有编码问题,它们也有不同的字符。文档是否有明确的编码,例如UTF-8?Mike,我不确定您的帖子(您想完成什么)。点头叫喊?没有发生任何事情,因此我将其替换为console.log。我只看到从1到65535的数字被打印出来。@OderflaV8.9.4。该代码片段也适用于v9.11.0、v7.10.1和v6.14.1,这是npx提供给我的。我运行
npxnode@6
在命令行中给我一个REPL,然后我粘贴到命令中,它漂亮地打印出一个字符串数组。