我需要使用Python和pyRTF在RTF中生成一个文档,一切正常:我对重音字母没有问题,它甚至接受欧元符号没有错误,但是我得到了这个符号而不是€
:¤
。
我用这种方式编码字符串:
x.encode("iso-8859-15")
我搜索了很多,但我无法解决这个问题,我需要做些什么才能获得欧元符号?
答案 0 :(得分:5)
RTF标准使用UTF-16,但形状适合RTF命令序列格式。记录在http://en.wikipedia.org/wiki/Rich_Text_Format#Character_encoding。不幸的是,pyRTF没有为你做任何编码;处理这个已经在项目的TODO上,但显然他们在放弃图书馆之前从未达到过这个目标。
这是基于我最近在项目中使用的代码。我现在发布了rtfunicode
on PyPI,支持Python 2和3; python 2版本:
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'而不是:
>>> u'\u20AC'.encode('rtfunicode') # EURO currency symbol
'\\u8364?'
以这种方式将您插入RTF文档的任何文本编码。
请注意,它仅支持UCS-2 unicode(\uxxxx
,2个字节),而不支持UCS-4(\Uxxxxxxxx
,4个字节); rtfunicode
1.1通过简单地将UTF-16代理对编码为两个\uDDDDD?
有符号整数来支持这些。
答案 1 :(得分:0)
好消息是你没有做错任何事。坏消息是RTF无论如何都被视为ISO 8859-1。
>>> print u'€'.encode('iso-8859-15').decode('iso-8859-1')
¤
如果您希望正确阅读,则需要使用Unicode escape。
>>> print hex(ord(u'€'))
0x20ac