我有下面的代码,它的行为非常奇怪。
当我执行以下操作时,utf-8很好地转换为unicode。
print u'xE1x80x96xE1x80xBBxE1x80xB1xE1x80xACxE1x80xBAxE1x80x9BxE1x80x8AxE1x80xBA'.encode('raw_unicode_escape')
这很好。但是,当我从sys.获得utf-8字符串时。哎呀,它不工作。
import sys
if __name__ == "__main__":
args = sys.argv
input_string = args[1]
if type(input_string) is not unicode:
input_string = unicode(input_string, "utf-8")
print type(input_string)
print input_string
当我像下面这样运行时,
python test_print.py "xE1x80x96xE1x80xBBxE1x80xB1xE1x80xACxE1x80xBAxE1x80x9BxE1x80x8AxE1x80xBA"
我得到了下面相同的字符串,它没有被转换成unicode。
<type 'unicode'>
xE1x80x96xE1x80xBBxE1x80xB1xE1x80xACxE1x80xBAxE1x80x9BxE1x80x8AxE1x80xBA
我需要转换来自sys的输入。
请帮助。
谢谢。
实际Python级别的字符串字面量(对于str
和unicode
)是Python自动解析字符转义的唯一地方。如果您想转换像这样使用文字转义的外部字符串,您需要做这样的事情来显式调用文字转义解释机制:
# Converts from str to str interpreting escapes, then decodes those bytes
# using the UTF-8 encoding
input_string = args[1].decode('string_escape').decode('utf-8')
确切的步骤在Python 3中略有不同(您必须使用unicode_escape
和codecs
模块,并添加额外的步骤将文字解码的str
转换为latin-1
bytes
,然后再解码为utf-8
,因为不支持text->text编码和解码),但它是一个类似的过程。