我想编写一个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()
但这并没有改变我的编码。
RTF共有三种,我不知道您使用哪种。您可以通过在纯文本编辑器中打开文件或仅使用less
/ more
/ cat
/ type
/任意方式将其打印到终端上来判断。
首先,简单的情况:纯文本RTF。
纯文本RTF文件以开头{\rtf
,并且其中的所有文本都是(正如您期望的那样)纯文本-尽管有时文本行会被格式命令(以\
- 开头)分隔为单独的行。由于所有格式设置命令都是纯ASCII格式,因此,如果将纯文本RTF从一个字符集转换为另一个字符集(只要两者都是ASCII的超集,如cp949和utf-8都是),它应该可以正常工作。
但是,该文件也可能具有格式化命令,该命令指定要写入的字符集。此命令看起来像\ansicpg949
。当像Wordpad这样的RTF编辑器打开您的文件时,它将把所有不错的UTF-8数据解释为cp949数据,并从该文件中删除所有内容,除非您对其进行修复。
解决该问题的最简单方法是弄清楚您的编辑器要在其中放置UTF-8文件的字符集。也许是\ansicpg65001
,也许是\utf8
,也许是完全不同的东西。因此,只需将一个简单的文件另存为UTF-8 RTF,然后查看以纯文本格式其内容,然后\ansicpg949
用正确的文件替换文件中的字符串即可。(请注意,代码页65001并不是真正的 UTF-8,但是它很接近,许多Microsoft代码都假定它们是相同的……)
另外,某些RTF编辑器(如Apple的TextEdit)将转义任何非ASCII字符(例如,a é
存储为\'e9
),因此没有任何要转换的内容。
最后,Office Open XML包含针对称为RTF的东西的XML规范,但实际上并不是一回事。我相信许多RTF编辑器都可以解决这个问题。幸运的是,您可以采用与纯文本RTF相同的方式进行处理-所有XML标记均具有纯ASCII名称。
最简单的情况是压缩的纯文本RTF。这是同一件事,但是我相信可以用zlib压缩它。或者,它实际上可以是.zip存档中的RTFD(可以是纯文本RTF以及单独文件中的图像和其他内容,也可以是带有格式运行的实际纯文本存储在单独的文件中)。无论如何,如果您有其中之一,file
大多数Unix系统上命令都应该能够将其检测为“压缩RTF”,这时我们可以找出具体格式并解压缩,然后可以将其编辑为纯文本RTF(或RTFD)。
不用说,如果您不首先解压缩,则文件中将不会看到您熟悉的文本,并且您很容易最终破坏它,因此无法通过更改将其解压缩或解压缩为垃圾任意字节转换为不同的字节。
最后,最困难的情况是:二进制RTF。
尽管它们经过了逆向工程,但它们的最早版本是未记录的格式。更高版本是公共规格。Wikipedia具有指向规范的链接。如果您想手动解析它,则可以,但这将是大量的代码,并且您将必须自己编写它。
更好的解决方案是使用PyPI上的许多库之一,该库可以将RTF(包括二进制RTF)转换为其他格式,然后可以轻松对其进行编辑。