在以任何方式复制或几乎触摸文件时,Windows会将其编码更改为默认值1252:Western European。在我正在使用的文本编辑器EditPad Pro Plus中,我可以看到并转换编码。我相信这种转换是有效的,因为我一直在使用Windows和UNIX之间的文件,而且我知道当我的文本编辑器更改编码时,文件在UNIX中正确读取,之前它们会导致问题。
我想整体转换文件。所以我试图在Windows 10中使用Python,从Powershell(使用Python v 3.6.2)或CygWin(使用Python v 2.7.13)调用。我看到codecs
和io
都用于工作,评论io
是Python 3的正确方法。
但文件未转换 - codecs
或io
。下面的脚本成功复制了文件,但我的文本编辑器仍然将它们报告为1252。 UniversalDetector(在下面脚本的注释部分中)将其编码报告为“ascii”。
要使这些转换成功,需要做些什么?
import sys
import os
import io
#from chardet.universaldetector import UniversalDetector
BLOCKSIZE = 1048576
#detector = UniversalDetector()
#def get_encoding( current_file ):
# detector.reset()
# for line in file(current_file):
# detector.feed(line)
# if detector.done: break
# detector.close()
# return detector.result['encoding']
def main():
src_dir = ""
if len( sys.argv ) > 1:
src_dir = sys.argv[1]
if os.path.exists( src_dir ):
dest_dir = src_dir[:-2]
for file in os.listdir( src_dir ):
with io.open( os.path.join( src_dir, file ), "r", encoding='cp1252') as source_file:
with io.open( os.path.join( dest_dir, file ), "w", encoding='utf8') as target_file:
while True:
contents = source_file.read( BLOCKSIZE )
if not contents:
break
target_file.write( contents )
#print( "Encoding of " + file + ": " + get_encoding( os.path.join( dest_dir, file ) ) )
else:
print( 'The specified directory does not exist.' )
if __name__ == "__main__":
main()
我尝试了一些变体,例如将文件作为UTF8打开,调用read()而没有块大小,最初,编码的指定方式略有不同。它们都成功复制了文件,但没有按预期编码。
答案 0 :(得分:2)
ASCII是许多编码的通用子集。它是UTF-8,Latin-1和cp1252--以及整个ISO-8859系列的子集,其中包含俄语,希腊语等编码。如果您的文件实际上是ASCII,则无需转换任何内容和系统只是说“cp1252”,因为这些文件与兼容。您可以添加BOM以将文件标记为UTF(编码utf-8-sig
),但坦率地说,我没有看到这一点。 UTF实际上并不需要它,因为UTF文件可以通过多字节字符的结构识别。
如果您想尝试编码,请使用包含非ASCII字符的文本:法语,俄语,中文,甚至带有一些重音词的英语(或Microsoft应用程序喜欢插入的愚蠢的定向引号)。将“Wikipédiaenfrançais”保存在文件中并重复您的实验,您将获得截然不同的结果。
我强烈建议使用Python 3,以及其他任何与字符编码有关的内容。 Python 2编码方法导致了许多无意义的混淆,实际上是打破兼容性和引入Python 3的主要原因之一。
作为奖励,在Python 3中,您可以使用带有open()
参数的encoding
。您不需要任何模块来更改编码。