相关疑难解决方法(0)

在浏览器下载中保留 UTF-8 BOM

我有一个 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。

browser curl byte-order-mark jax-rs utf-8

8
推荐指数
1
解决办法
1685
查看次数

Django创建包含Unicode的CSV文件,可以直接用Excel打开

我想通过Django创建一个包含unicode数据(希腊字符)的CSV文件,我希望它可以直接从MS Excel打开.在其他地方,我读过有关unicodecsv库的内容,我决定使用它.所以,这是我的看法;

def get_csv(request, id):
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment; filename=csv.csv'
    writer = unicodecsv.writer(response, encoding='utf-16"')
    writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "????????"])
    return response

现在,除了utf-16之外,我真的尝试过编写器的编码参数,包括utf-8,utf-8-sig,utf-8-le,utf-16-le和其他人.每当我用excel打开文件时,我总是看到希腊字符本应该存在的垃圾.

Notepad ++能够毫无问题地打开文件.我究竟做错了什么 ?

更新:这是我在jd回答之后尝试的内容:

import csv
response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename=test.csv'
response.write(u'\ufeff'.encode('utf8'))
writer = csv.writer(response, delimiter=';' , dialect='excel')
writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "????????"])
return response

仍然没有运气 - 现在我也可以在Excel中看到BOM(作为垃圾) - 我也尝试使用unicodecsv和一些其他选项,但再次没有工作:(

更新2:我在dda的提议之后尝试了这个:

writer = unicodecsv.writer(response, delimiter=';' , dialect='excel')
writer.writerow(codecs.BOM_UTF16_LE)
writer.writerow([ (u'????????').decode('utf8').encode('utf_16_le')])

仍然没有运气:(这是我得到的错误:

UnicodeEncodeError at /csv/559
'ascii' codec can't encode …

python csv django unicode excel

6
推荐指数
1
解决办法
8782
查看次数

标签 统计

browser ×1

byte-order-mark ×1

csv ×1

curl ×1

django ×1

excel ×1

jax-rs ×1

python ×1

unicode ×1

utf-8 ×1