2017-03-02 67 views
3

有没有内置的方法可以做到这一点?Python。将转义的utf字符串转换为utf-string

rawstr = r"3 \u176? \u177? 0.2\u176? (2\u952?)" 
#required str is 3 ° ± 0.2° (2θ). 

In [1] rawstr.unescape()? 
Out[1]: '3° ± 0.2° 2θ' 

的问题是如何rawstr转换为 'UTF-8'。

请参阅我的答案,以获得更清晰。

请回答是否比我现在正在做的更好的选择。

+1

你可以使用'codecs.raw_unicode_escape_decode'。不幸的是,您的原始字符串包含无效的Unicode转义符,因此它不起作用(我指的是'\ u176?',它们应该是'\ uXXXX'形式) – Bakuriu

+0

或者,创建一个字符串(使用'rb'作为前缀)并使用'.decode'('unicode-escape')',但是由于'\ u176?'不是有效的Unicode转义符,所以再次失败。 – Bakuriu

+0

谢谢。我想我必须为我编写解码器。 – Rahul

回答

1

如果您使用的是Windows和pythonnet安装

import clr 
clr.AddReference("System") 
clr.AddReference("System.Windows.Forms") 
import System.Windows.Forms as WinForms 

def rtf_to_text(rtf_str): 
    """Converts rtf to text""" 

    rtf = r"{\rtf1\ansi\ansicpg1252" + '\n' + rtf_str + '\n' + '}' 
    richTextBox = WinForms.RichTextBox() 
    richTextBox.Rtf = rtf 
    return richTextBox.Text 

print(rtf_to_text(r'3 \u176? \u177? 0.2\u176? (2\u952?)')) 
-->'3 ° ± 0.2° (2θ)' 
2

是的,有!

对于Python 2:

print r'your string'.decode('string_escape') 

为Python 3,您需要将其转化为字节,然后用decode

print(rb'your string'.decode('unicode_escape')) 

注意,这不会工作你的情况,因为你的符号没有正确转义(即使你使用“正常”的方式打印它们,它不起作用)。


你的字符串应该是这样的:

rb'3\u00B0 \u00b1 0.2\u00B0 2\u03B8' 

请注意,如果您需要在python的string转化为bytes,您可以使用bytes功能。

my_str = r'3\u00B0 \u00b1 0.2\u00B0 2\u03B8' 
my_bytes = bytes(my_str, 'utf-8') 
print my_bytes.decode('string_escape') # python 2 
print(my_bytes.decode('unicode_escape')) # python 3 
+0

我认为这是ansi文本。 – Rahul

+0

“ANSI文本”不是一个明确定义的术语。在Windows上,它被误导地用于引用系统的本地默认编码,该编码被广泛地进一步误解为特定的代码页(通常1252,尽管你看到了全部437,850以及任何默认编码读者的语言环境)。 – tripleee