我有一个 JAX-RS REST-Service,它生成一个 CSV 文件并将其流回浏览器。一切都设置为 UTF-8,所以我通过浏览器下载的文件也是一个有效的 UTF-8 文件(没有 BOM),它在 Notepad++、Sublime 等中向我显示有效、可读的 UTF-8 变音等。
虽然在 Excel 中打开这样的文件会导致不可读的变音等,因为 Excel 显然试图用另一个字符集打开它(CP-1252,我猜,但这并不重要)。
通过 Notepad++ 使用 BOM 保存文件并在 Excel 中重新打开它效果很好。似乎 BOM 的检测是 Excel 用来检测 UTF-8 的唯一方法。无论如何 - 我认为添加 BOM 可以帮助......
做过某事。结果一样。过了一会儿,我发现在某些情况下 BOM 会被删除:如果我在 BOM 之前添加任何字符,我可以在我的十六进制编辑器中看到 BOM。删除该字符后,BOM 将不再存在。
当我继续通过 cURL 下载文件时,我真的很惊讶。BOM 就在那里!在那之前,我认为这可能与我的应用程序、内容类型、编码、HTTP 标头等有关 - 但它们似乎都很好。
现在,经过数小时的尝试不同的东西,关于如何告诉浏览器保留 BOM 的任何想法?我可以设置任何 HTTP 标头吗?由于 Chrome、Internet Explorer、Edge、Firefox 都删除了 BOM,这对我来说听起来有点像浏览器约定......
非常感谢您的大力帮助!
编辑:感谢 sideshowbarker 的回答,我找到了一种解决方法,即在内容之前添加两个 BOM,因此在浏览器删除第一个 BOM 后,将剩余一个 BOM。
我正在尝试在Angular 6中构建一个表单,它提供了一个文件选择框,允许用户选择多个文件(Stackblitz:https://stackblitz.com/edit/angular-yjummp ).
模板看起来像:
<form [formGroup]="form">
<input id="files" formControlName="files" type="file" accept="image/*,video/*" multiple (change)="onFilesChanged($event)"/>
</form>
Run Code Online (Sandbox Code Playgroud)
我在TypeScript中构建表单,如下所示:
public form = new FormGroup({
files: new FormControl('')
});
public onFilesChanged(event: any): void {
console.log(event.target.files);
console.log(this.form.value);
}
Run Code Online (Sandbox Code Playgroud)
现在,在onFilesChangedHandler中,通过访问event.target.files(显然)可以从事件中正确检索所选文件,但打印表单值只打印一个文件.我一直在尝试使用多种方式FormArray,但到目前为止还没有运气.
有任何想法吗?非常感谢!