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)是加密的,不对所有查看者开放。
记住 GET
、PUT
、PATCH
、DELETE
和 POST
的正确用法也很重要。在发送文件时,我很难找到一个很好的理由来使用 GET
作为请求者(如果请求者是发送 csv 文件的人),这是上面唯一一个违反约定的地方在请求正文中发送数据。不过,在 GET
响应正文中包含数据是完全可以的。
解决方案
evolutionxbox
评论解决了这个问题,你需要使用 encodeURIComponent 而不是 encodeURI
// encodes characters such as ?,=,/,&,:
console.log(`?x=${encodeURIComponent('test?')}`);
// expected output: "?x=test%3F"
我正在尝试通过以下代码生成短 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)是加密的,不对所有查看者开放。
记住 GET
、PUT
、PATCH
、DELETE
和 POST
的正确用法也很重要。在发送文件时,我很难找到一个很好的理由来使用 GET
作为请求者(如果请求者是发送 csv 文件的人),这是上面唯一一个违反约定的地方在请求正文中发送数据。不过,在 GET
响应正文中包含数据是完全可以的。
解决方案
evolutionxbox
评论解决了这个问题,你需要使用 encodeURIComponent 而不是 encodeURI
// encodes characters such as ?,=,/,&,:
console.log(`?x=${encodeURIComponent('test?')}`);
// expected output: "?x=test%3F"