RTF标准使用UTF-16,但其形状适合RTF命令序列格式。记录在http://en.wikipedia.org/wiki/Rich_Text_Format#Character_encoding。不幸的是,pyRTF不为您进行任何编码;处理这一点已经在项目的TODO中完成了,但是很明显,他们在放弃库之前从来没有做到这一点。在
这是基于我最近在一个项目中使用的代码。我现在将其发布为^{} on PyPI,支持Python2和3;Python2版本:import codecs
import re
_charescape = re.compile(u'([\x00-\x1f\\\\{}\x80-\uffff])')
def _replace(match):
codepoint = ord(match.group(1))
# Convert codepoint into a signed integer, insert into escape sequence
return '\\u%s?' % (codepoint if codepoint < 32768 else codepoint - 65536)
def rtfunicode_encode(text, errors):
# Encode to RTF \uDDDDD? signed 16 integers and replacement char
return _charescape.sub(_replace, escaped).encode('ascii')
class Codec(codecs.Codec):
def encode(self, input, errors='strict'):
return rtfunicode_encode(input, errors), len(input)
class IncrementalEncoder(codecs.IncrementalEncoder):
def encode(self, input, final=False):
return rtfunicode_encode(input, self.errors)
class StreamWriter(Codec, codecs.StreamWriter):
pass
def rtfunicode(name):
if name == 'rtfunicode':
return codecs.CodecInfo(
name='rtfunicode',
encode=Codec().encode,
decode=Codec().decode,
incrementalencoder=IncrementalEncoder,
streamwriter=StreamWriter,
)
codecs.register(rtfunicode)
而不是编码为“iso-8859-15”,您可以编码为“rtfunicode”:
^{pr2}$
以这种方式对插入到RTF文档中的任何文本进行编码。在
注意,它只支持UCS-2unicode(\uxxxx,2个字节),不支持UCS-4(\Uxxxxxxxx,4个字节);rtfunicode1.1只支持将UTF-16代理项对编码为两个\uDDDDD?有符号整数。在