Linux文本文件编码,用于在Windows上打开它



我有一个关于Linux和Windows编码的问题。我在linux上保存一个文本文件并下载它(使用Python语言),使用UTF-8编码。

如果我用Linux中的任何程序打开文件,每个重音符号ñ都正确显示。

当我在Windows上的文本编辑器(如Notepad或notepad++)中打开文件时,它也可以正常工作,但在其他程序中重音标记,ñ或其他字符不能正确显示。

下面是我打开和下载文件的代码:

with open(new_file_path + new_file_temp, 'w+', encoding="utf-8") as f:
# Writing data
f.seek(0)
response = HttpResponse(f.read(), content_type="text/plain; charset=utf-8")
response['Content-Disposition'] = 'attachment; filename=budget.bc3'

bc3(也称为FIE-BDC)扩展是建设预算等的标准。

那么,你认为问题是什么?unix和windows编码之间的问题?我应该用另一种编码保存文件吗?

帮忙吗?

编辑我正在编辑这个问题,添加了一个最小的可重复的例子,只是保存(不下载)带有口音和"ñ"在里面。我正在使用Django==2.2.5和Python 3.7.12在Ubuntu 20.04:

import os, random, string
from django.http import HttpResponse
new_file_temp = '/budget.bc3'
new_file_path = os.path.expanduser('~')
with open(new_file_path + new_file_temp, 'w+', encoding="utf-8") as f:
f.write("~V|Planreforma SL|FIEBDC-3/2020|Stimat||ANSI||2||||n")
f.write("~K|3\3\3\8\3\3\3\3\EUR|0\0\0\0\10|8\3\3\3\3\3\3\3\3\3\3\3\EUR||n")
f.write("~C|PRESUPUESTO##||Presu test|522.26|29092021|0|n")
f.write("~D|PRESUPUESTO##n")
f.write("|C_670483#\\1n")
f.write("C_670484#\\1n")
f.write("|n")
f.write("~C|C_670483#||Albañilería (300 €)|522.00|29092021|0|n")
f.write("~D|C_670483#n")
f.write("|PC_4694660\\1.000n")
f.write("|n")
f.write("~C|PC_4694660|u|AYUDAS ALBAÑILERIA|522.00||0|n")
f.write("~T|PC_4694660|AYUDAS ALBAÑILERIA PA. en ayuda en cualquier trabajo de albañilería necesario para la correcta ejecución y montaje de las instalaciones , subida y bajadas de materiales, etc. Ayudas albañileria|n")
f.write("~C|C_670484#||Máquinas|0.26|29092021|0|n")
f.write("~D|C_670484#n")
f.write("|PC_4694661\\1.000n")
f.write("|n")
f.write("~C|PC_4694661|m2|DESB. Y LIMP. TERRENO A MÁQUINA|0.26||0|n")
f.write("~T|PC_4694661|M2. Desbroce y limpieza de terreno por medios mecánicos, sin carga ni transporte y con p.p. de costes indirectos.|n")
f.write("~M|C_670483#PC_4694660|1\1\|1.000|n")
f.write(" - \1.000\\\\|n")
f.write("~M|C_670484#PC_4694661|2\1\|1.000|n")
f.write(" - \1.000\\\\|n")

我也尝试了上面的代码"utf-8-sig":

with open(new_file_path + new_file_temp, 'w+', encoding="utf-8") as f:

所以,就像我上面写的,如果我用像gedit, notepad++, notepad, geany等文本编辑器打开文件,字符会正确显示(Ubuntu和Windows)。如果我尝试用程序打开这个特定的文件扩展名(.bc3),如VisualCost或Presto,问题出现了:像重音,ñ这样的字符不能很好地显示。

我正在寻找,我试过用Ultraeditor。你可以配置这个软件告诉你,如果一个文件是在DOS格式或不是,这似乎是问题。该文件需要在DOS格式提到的程序(VisualCost和Presto)。如果我把它转换成DOS一切工作。因此,考虑到我是从UNIX系统生成文件,我该怎么做呢?

下载VisualCost (https://itec.es/soporte/descargas/visualcost/)

下载Presto (https://www.rib-software.es/pages/info.htm)

我通过谷歌搜索" fiebdc-3 encoding "找到了gauss/fiebdc.py;并且它表明只有以下字符在.bc3文件中有效,但是您的文件有其他重音和欧元符号,因此它可能违反了规范。请参阅https://www.fiebdc.es/fiebdc(来自源代码头的链接),它也有一个可下载的格式检查器。都是西班牙语的。最新规范为FIEBDC-3/2020。

"valid_code" : re.compile(u"[^A-Za-z0-9ñÑ.$#%&_]"),  # line 105

它还指示以下编码选项(第90-100行):

self.__format_list = ["FIEBDC-3/95", "FIEBDC-3/98", "FIEBDC-3/2002",
"FIEBDC-3/2004", "FIEBDC-3/2007"]
# ANSI->¿"ISO-8859-15" or "latin1 ISO-8859-1" or "cp1252 windows-1252"?
# 850 -> IBM850 -> cp850
# 437 -> IBM437 -> cp437
self.__character_sets_dict = {"ANSI" : "cp1252",
"850" : "850",
"437" : "cp437"}
self.__file_format = "FIEBDC-3/2007"
self.__generator = globalVars.version
self.__character_set = "850"

似乎暗示850(cp850是别名),但从您的示例中,只有cp1252(Windows-1252是别名)支持欧元符号。

UTF-8不是一个选项。对于您的数据,我会使用cp1252,因为它是唯一支持欧元符号的。这也是美国和西欧Windows的默认编码,所以如果UTF-8不在考虑范围内,西班牙语文件格式似乎是一个可能的选择。

阅读说明书。我确实找到了一个章节,专门提到使用850来向后兼容旧的规范,但如果您需要欧元符号,似乎文件头可以指示使用ANSI (cp1252)。