我正在尝试从Python脚本向RTF文件输出Unicode文本。背景信息如下:维基百科说:
对于 Unicode 转义,使用控制字 \u,后跟一个 16 位有符号十进制整数,表示 Unicode UTF-16 代码单元编号。为了让没有 Unicode 支持的程序也能够正常工作,必须在该数字之后指定该字符在指定代码页中最接近的表示方法。例如,\u1576? 将给出阿拉伯字母bāʼ ب,并指定不支持 Unicode 的旧程序应将其呈现为问号。
还有 这个Java输出RTF的问题 和 这个C#输出RTF的问题。
然而,我无法弄清楚如何从Python中将Unicode代码点输出为“带Unicode UTF-16代码单元编号的16位有符号十进制整数”。我尝试了这个:
for char in unicode_string:
print '\\' + 'u' + ord(char) + '?',
但是,当在文字处理器中打开时,输出只呈现为乱码;问题似乎是它不是UTF-16代码编号。但不确定如何获得它;虽然可以编码为utf-16,但如何获得代码编号呢?
顺便说一句,PyRTF不支持Unicode(它被列为“待办事项”),虽然pyrtf-NG应该支持Unicode,但该项目似乎没有得到维护,并且文档很少,因此我对在准生产系统中使用它持谨慎态度。
编辑:我的错误。上面的代码有两个错误 - 正如Wobble所指出的那样,字符串必须是Unicode字符串,而不是已经编码的字符串,并且上面的代码会产生字符之间带有空格的结果。正确的代码是这样的:
convertstring=""
for char in unicode(<my_encoded_string>,'utf-8'):
convertstring = convertstring + '\\' + 'u' + str(ord(char)) + '?'
这个方法很有效,在OpenOffice下至少可以工作。我将其留在这里供其他人参考(在下面的讨论中进行了进一步纠正)。
\u
后跟一个最大为32767的数字。 - Woobleord()
似乎为我生成了1576
。你确定你的是 Unicode 字符串而不是 UTF-8 字节吗? - Wooblerepr
示例。 - Mark Ransommy_encoded_string.decode('utf8')
而不是unicode(my_encoded_string)
。此外,这将转换每个字符,即使它是ASCII。 - Mark Ransom\u
控制码。 - Martijn Pieters