我应该使用哪种字符编码将字符串下载到文件中,并保留" \ n"?

时间:2016-03-16 22:35:40

标签: dart

在我的网络应用中,我使用此代码将字符串下载到本地光盘上的文件:

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")。我需要做些什么来保护它们?

3 个答案:

答案 0 :(得分:1)

从Dart 1.14开始,有一个UriData类,可以更轻松地使用data: 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();

应确保使用正确的编码来保留换行符。

答案 1 :(得分:1)

如果文件太大,data: Uri会导致浏览器发出"下载错误信号"。

改为创建一个临时Blob,并且仍应保留换行符:

AnchorElement tl = document.createElement('a');
var href = Url.createObjectUrl(new Blob([text]));
tl..attributes['href'] = href
  ..attributes['download'] = filename
  ..click();

答案 2 :(得分:0)

我无法获得"数据:text / html"工作(我不是专家),所以我使用" data:text / 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);

新行和标签被删除。