Dart 我应该使用哪种字符编码将字符串下载到文件中,并保留"\n";?
在我的web应用程序中,我使用以下代码将字符串下载到本地光盘上的文件:Dart 我应该使用哪种字符编码将字符串下载到文件中,并保留"\n";?,dart,Dart,在我的web应用程序中,我使用以下代码将字符串下载到本地光盘上的文件: void downloadFile(String filename, String text){ AnchorElement tl = document.createElement('a'); tl..attributes['href'] = 'data:text/plain;charset=utf-8,' + Uri.encodeComponent(text) ..attributes['d
void downloadFile(String filename, String text){
AnchorElement tl = document.createElement('a');
tl..attributes['href'] = 'data:text/plain;charset=utf-8,' + Uri.encodeComponent(text)
..attributes['download'] = filename
..click();
}
但这会删除所有换行符(“\n”)。我需要做些什么来保存它们呢?从Dart 1.14开始,有一个类使得使用
数据更加容易:
URI。您可以在这里这样使用它:
void downloadFile(String filename, String text){
AnchorElement tl = document.createElement('a');
var href = UriData.fromString(text, encoding: UTF8);
tl..attributes['href'] = href.toString()
..attributes['download'] = filename
..click();
它应该确保使用正确的编码来保留换行符。我根本无法使用“数据:文本/html”(我不是专家),所以我使用“数据:文本/csv”,并下载一个csv文件。如果用户需要文本文件,他们可以在电子表格中打开并导出。它实际上符合我的目的
void downloadFile(String filename, String text) {
text=text.replaceAll('\n','%0A');
text=text.replaceAll('\t','%2C');
text="data:text/csv,"+text;
AnchorElement tl = document.createElement('a');
tl
..attributes['href'] = text
..attributes['download'] = filename
..click();
}
我称之为:
String s="one two \n three four \n five\tsix\t 7";
downloadFile('test.csv',s);
如果你:
downloadFile('test.txt',s);
换行符和制表符被撕掉。如果文件太大,
数据:
Uri会导致浏览器发出“下载错误”的信号
改为创建临时Blob,并应保留换行符:
AnchorElement tl = document.createElement('a');
var href = Url.createObjectUrl(new Blob([text]));
tl..attributes['href'] = href
..attributes['download'] = filename
..click();
字符编码,如
utf-8
vsiso-8859-1
等,与换行符的保存关系不大\n
是符号换行符,可能是0x0aLF
(换行符)或0x0dCR
(回车符)或序列0x0d0x0aCRLF
,具体取决于上下文。重要的是可以转换换行符的文本模式,而二进制模式可以保留字节的原样,我认为这是UriData
的功能——防止所有字符的重新组合,并按原样显示数据。谢谢。我试过上面的方法。我插入了“new”(var href=new UriData…),但是我该如何处理该对象呢?我尝试了href.contentText、contentAsBytes等,但没有成功。您可以使用href.uri
获取uri
对象。相反,您可以使用Uri.dataFromString
直接创建Uri
对象,而不是UriData
对象:var href=new Uri.dataFromString(字符串,编码:UTF8)代码>。(不需要指定“text/plain”,您应该使用编码
来指定字符集,而不是使用参数-这对拼写更安全)。我已经更新了我的代码示例,直接使用编码
。我只是在UriData
对象上调用toString()
来获取href。您好,感谢您再次查看,但恐怕这仍然会删除换行符。