在Express Response中使用特殊字符(变音符号)

我正在使用Express来提供像这样的文件下载:

const fileStream = Storage.getFileStream(path); res.setHeader('Content-disposition', `attachment; filename="${filename}"`); res.setHeader('Content-type', contentType); res.setHeader('Content-length', size); fileStream.pipe(res); 

filename包含特殊字符(Ä,Ü,è,…)时会抛出一个错误,说我正在使用不允许的字符。

我发现使用unidecode的解决scheme。 但是有没有一个解决scheme保持“Ä”而不是将其转换为“A”

我search这个问题,但我很困惑如何处理这个正确的方式,所以原谅我,如果这个问题是重复的… … –


解决scheme(稍后添加):我发现这个解决scheme适用于我,并保留文件名中的所有特殊字符:

 const filename = encodeURI(file.filename); res.setHeader('Content-disposition', `attachment; filename*=UTF-8''${filename}; filename=${filename}`); res.setHeader('Content-type', contentType); res.setHeader('Content-length', size); 

您可以尝试使用其中一个优秀的库Unicode JavaScript 8.0规范化 – NFC,NFD,NFKC,NFKD来规范化string。 哪些可以使用: –

npm安装unorm

一个示例代码 –

 var unorm = require('unorm'); var text = 'The \u212B symbol invented by AJ \u00C5ngstr\u00F6m ' + '(1814, L\u00F6gd\u00F6, \u2013 1874) denotes the length ' + '10\u207B\u00B9\u2070 m.'; var combining = /[\u0300-\u036F]/g; // Use XRegExp('\\p{M}', 'g'); see example.js. console.log('Regular: ' + text); console.log('NFC: ' + unorm.nfc(text)); console.log('NFD: ' + unorm.nfd(text)); console.log('NFKC: ' + unorm.nfkc(text)); console.log('NFKD: * ' + unorm.nfkd(text).replace(combining, '')); console.log(' * = Combining characters removed from decomposed form.'); 

来源: https : //github.com/walling/unorm我希望它的作品。