如何将CP949 RTF转换为UTF8编码的RTF?

2024-09-30 22:10:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想编写一个python脚本,将文件编码从cp949转换为utf8。文件最初是用cp949编码的。 我的脚本如下:

cpstr = open('terms.rtf').read()  
utfstr = cpstr.decode('cp949').encode('utf-8')  
tmp  = open('terms_utf.rtf', 'w')  
tmp.write(utfstr)  
tmp.close()

但这并没有像我想的那样改变编码。在


Tags: 文件脚本编码readopenutf8tmputf
2条回答

有三种,我不知道。您可以通过在纯文本编辑器中打开该文件,或者只使用less/more/cat/type/任何方法将其打印到终端。在


首先,简单的情况:明文RTF。在

一个纯文本RTF文件以{\rtf开头,其中的所有文本都是纯文本(正如您所期望的那样),尽管有时文本的运行会被拆分成单独的运行,其中的格式化命令以\-开头。由于所有的格式化命令都是纯ASCII,如果您将纯文本RTF从一个字符集转换成另一个字符集(只要这两个字符集都是ASCII的超集,就像cp949和utf-8一样),它应该可以正常工作。在

但是,该文件也可能有一个格式化命令,该命令指定文件的写入字符集。这个命令看起来像\ansicpg949。当一个像Wordpad这样的RTF编辑器打开你的文件时,它会把你所有漂亮的UTF-8数据解释成cp949数据,除非你修复它,否则mojib会把它弄得一团糟。在

解决这个问题最简单的方法是找出编辑器想要为UTF-8文件放置什么字符集。也许是\ansicpg65001,也许是{},也许是完全不同的东西。所以只需将一个简单的文件保存为UTF-8rtf,然后以纯文本的形式查看it,看看它有什么代替\ansicpg949,并用正确的字符串替换文件中的字符串。(注意,代码页65001并不是真正的UTF-8,但它很接近,而且很多微软代码都假设它们是相同的……)

另外,一些RTF编辑器(如Apple的TextEdit)会转义任何非ASCII字符(例如,é被存储为\'e9),因此没有什么可以转换的。在

最后,officeopenxml包含了一个称为RTF的XML规范,但实际上不是一回事。我相信很多RTF编辑器可以处理这个问题。幸运的是,您可以像纯文本RTF一样对待这一点,所有XML标记都有纯ASCII名称。在


几乎同样简单的情况是压缩明文RTF。这是同一件事,但我相信是用zlib压缩的。或者它实际上可以是.zip归档文件中的RTFD(可以是纯文本RTF与图像和其他内容一起放在单独的文件中,或者是实际的纯文本,格式运行存储在一个单独的文件中)。不管怎样,如果您有其中一个,大多数Unix系统上的file命令应该能够将其检测为“compressed RTF”,此时我们可以确定具体的格式并将其解压缩,然后您可以将其编辑为明文RTF(或RTFD)。在

不用说,如果你不先解压这个文件,你就看不到你熟悉的文本,你很容易就把它破坏了,这样它就不能被解压了,或者通过把任意字节改成不同的字节来解压成垃圾。在


最后,难的情况是:二进制RTF。在

最早的版本是以一种未记录的格式,尽管他们已经被逆向工程。后面的版本是公共规范。Wikipedia有指向规范的链接。如果你想手动解析它,你可以,但是这需要大量的代码,你必须自己编写。在

一个更好的解决方案是使用one of the many libraries on PyPI,它可以将RTF(包括二进制RTF)转换为其他格式,然后可以轻松地编辑这些格式。在

import codecs
cpstr = codecs.open('terms.rtf','r','cp949').read()
u = cpstr.encode('cp949').decode('utf-8')
tmp  = open('terms_utf.rtf', 'w') 
tmp.write(u)  
tmp.close()

相关问题 更多 >