Javascript encodeURI 不适用于 csv

Javascript encodeURI not work well with csv

我正在尝试通过以下代码生成短 CSV 文件:

来源

const csv_content = `"Hello"þ"World"þ"#"þ"123"`;
const href = 'data:attachment/csv;charset=utf-8,' + encodeURI(csv_content);
console.log(href);

我在浏览器中 copy/past href 值 并下载它。

href 的值

data:attachment/csv;charset=utf-8,%22Hello%22%C3%BE%22World%22%C3%BE%22#%22%C3%BE%22123%22

我在 Excel 中打开它,但在 # 字符和 # 本身之后无法显示任何字符。 如果有人能向我解释为什么 encodeURI# return 我这个问题,那就太好了!

解决方案

evolutionxbox 评论解决了这个问题,你需要使用 encodeURIComponent 而不是 encodeURI

// encodes characters such as ?,=,/,&,:
console.log(`?x=${encodeURIComponent('test?')}`);
// expected output: "?x=test%3F"

您的问题实际上涉及到一个重要的话题,那就是应该在 URL 中传递什么与应该在正文中传递什么。

当您遇到复杂的对象时,例如 csv 文件,最好使用正文来保存此信息,因为它对字符的挑剔程度要低得多。

另一个原因是URL是公开且未受保护的信息。如果你制作了一个包含敏感数据的 csv 文件,那么世界上任何人都可以看到它。正文中的数据(假设您使用的是 https)是加密的,不对所有查看者开放。


记住 GETPUTPATCHDELETEPOST 的正确用法也很重要。在发送文件时,我很难找到一个很好的理由来使用 GET 作为请求者(如果请求者是发送 csv 文件的人),这是上面唯一一个违反约定的地方在请求正文中发送数据。不过,在 GET 响应正文中包含数据是完全可以的。

解决方案

evolutionxbox 评论解决了这个问题,你需要使用 encodeURIComponent 而不是 encodeURI

// encodes characters such as ?,=,/,&,:
console.log(`?x=${encodeURIComponent('test?')}`);
// expected output: "?x=test%3F"