这里有两个问题。我有一组通常是带有BOM的UTF-8文件。我想将它们(理想情况下)转换为没有BOM的UTF-8。似乎codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors)
可以解决这个问题。但是我真的看不到任何有关用法的好例子。这将是处理此问题的最佳方法吗?
source files:
Tue Jan 17$ file brh-m-157.json
brh-m-157.json: UTF-8 Unicode (with BOM) text
同样,如果我们能够处理清楚知道的不同输入编码(看到的ASCII和UTF-16),那将是理想的。看来这一切都是可行的。是否有一种解决方案可以采用任何已知的Python编码并以UTF-8格式输出而无需BOM?
*从下面 *编辑1个 建议的sol’n(谢谢!)
fp = open('brh-m-157.json','rw')
s = fp.read()
u = s.decode('utf-8-sig')
s = u.encode('utf-8')
print fp.encoding
fp.write(s)
这给了我以下错误:
IOError: [Errno 9] Bad file descriptor
有人在评论中告诉我,错误是我以’rw’模式而不是’r +’/’r + b’模式打开文件,因此我最终应重新编辑问题并删除已解决的部分。
只需使用“ utf-8-sig”编解码器:
fp = open("file.txt")
s = fp.read()
u = s.decode("utf-8-sig")
这样就可以得到一个unicode
没有BOM的字符串。然后,您可以使用
s = u.encode("utf-8")
以在中获取普通UTF-8编码的字符串s
。如果文件很大,则应避免将它们全部读入内存。BOM只是文件开头的三个字节,因此您可以使用以下代码将其从文件中删除:
import os, sys, codecs
BUFSIZE = 4096
BOMLEN = len(codecs.BOM_UTF8)
path = sys.argv[1]
with open(path, "r+b") as fp:
chunk = fp.read(BUFSIZE)
if chunk.startswith(codecs.BOM_UTF8):
i = 0
chunk = chunk[BOMLEN:]
while chunk:
fp.seek(i)
fp.write(chunk)
i += len(chunk)
fp.seek(BOMLEN, os.SEEK_CUR)
chunk = fp.read(BUFSIZE)
fp.seek(-BOMLEN, os.SEEK_CUR)
fp.truncate()
它打开文件,读取一个块,并将其比读取它的位置早3个字节写入文件。该文件被原位重写。较简单的解决方案是将较短的文件写入新文件,例如newtover的answer。那会更简单,但是在短时间内使用两倍的磁盘空间。
至于猜测编码,则可以从最具体到最不具体遍历整个编码:
def decode(s):
for encoding in "utf-8-sig", "utf-16":
try:
return s.decode(encoding)
except UnicodeDecodeError:
continue
return s.decode("latin-1") # will always work
UTF-16编码的文件不会解码为UTF-8,因此我们首先尝试使用UTF-8。如果失败,那么我们尝试使用UTF-16。最后,我们使用Latin-1-这将始终有效,因为所有256个字节在Latin-1中都是合法值。None
在这种情况下,您可能想要返回,因为这实际上是一个后备,并且您的代码可能想要更仔细地处理(如果可以)。
问题内容: 我们有一个数据输入人员,他在Windows上使用UTF-16编码,并且希望拥有utf-8并删除BOM。utf-8转换有效,但BOM仍然存在。我将如何删除?这是我目前拥有的: 如果我使用hexdump -CI,请参阅: 在结果文件中。如何删除物料清单? 谢谢 问题答案: 只需使用和: 将为您摆脱BOM表(并推断出字节序)。
我正在尝试使用iconv将UTF-16BE编码文件(字节顺序标记:0xFE 0xFF)转换为UTF-8,如下所示: 然而,结果输出具有UTF-8字节顺序标记(0xEF 0xBB 0xBF),这不是我需要的。有没有办法告诉iconv(或者有等效的编码)不要在UTF-8结果中放入BOM?
我尝试用JasperReport导出CSV文件,问题是当我想打印像“€”这样的货币时。 当我搜索解决方案时,我意识到这是关于文件编码的!我写这个代码! JasperReport导出的文件编码在“没有BOM的UTF-8”上。所以当我用Excel打开文件时,“€”看起来像“,”。但是当我用记事本打开文件时,“€”看起来像“€”。 在记事本上,我将文件编码转换为UTF-8(我认为是BOM),我保存文件。
我构建了一个System类型的XML对象。Xml。XmlDocument。 我使用保存()方法将其保存到文件中。 这会将文件以UTF-8格式与BOM一起保存。BOM表会导致后续的其他脚本出现问题。 当我们在记事本中打开XML文件并将其保存为UTF-8(没有BOM)时,其他脚本不会有问题。所以我被要求保存没有BOM的脚本。 保存方法的MS文档说明: encoding属性的值取自XmlDeclarat
是否可以将JavaScript中的UTF-8 BOM预置为生成的文本? 是的,在这种情况下,我确实需要UTF-8 BOM。
问题内容: 我在写一些注释过的PHP类,但偶然发现了一个问题。我的名字(用于@author标记)以一个(以UTF-8字符开头,…和一个奇怪的名字,我知道)结尾。 即使我将文件另存为UTF-8,也有一些朋友报告说他们看到这个字符完全弄乱了()。通过添加BOM表签名可以解决此问题。但是那件事让我有些烦恼,因为除了我在Wikipedia上以及关于SO的其他一些类似问题上所了解的之外,我对此并不了解。 我