Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7:使用解码unicode转义后返回utf-8_Python_Encoding - Fatal编程技术网

Python 2.7:使用解码unicode转义后返回utf-8

Python 2.7:使用解码unicode转义后返回utf-8,python,encoding,Python,Encoding,我正在尝试删除字符,但有不同的输入(可以是u'228'或\\u0001等等),因此我使用了encode(utf-8)。解码(unicode escape)将其转换为相同的格式并清除: s = "\\u0001" s.encode("utf-8") '\\u0001' s.encode("utf-8").decode("unicode-escape") u'\x01' 或 问题是如何回到utf-8之后? 找到.encode(“原始unicode\u escape”),它通过了基本测试,但仍然不

我正在尝试删除字符,但有不同的输入(可以是
u'228'
\\u0001
等等),因此我使用了encode(
utf-8
)。解码(
unicode escape
)将其转换为相同的格式并清除:

s = "\\u0001" 
s.encode("utf-8")
'\\u0001'
s.encode("utf-8").decode("unicode-escape")
u'\x01'

问题是如何回到
utf-8
之后? 找到
.encode(“原始unicode\u escape”)
,它通过了基本测试,但仍然不确定。

如下所示:

>>> s = "\\u0001"
>>> s.decode('unicode-escape')
u'\x01'
>>> s.decode('unicode-escape').encode('utf8')
'\x01'
下面是一个更明显的例子,其结果是UTF-8编码的:

>>> s = "\\u3030"
>>> s.decode('unicode-escape')
u'\u3030'
>>> s.decode('unicode-escape').encode('utf8')
'\xe3\x80\xb0'
像这样:

>>> s = "\\u0001"
>>> s.decode('unicode-escape')
u'\x01'
>>> s.decode('unicode-escape').encode('utf8')
'\x01'
下面是一个更明显的例子,其结果是UTF-8编码的:

>>> s = "\\u3030"
>>> s.decode('unicode-escape')
u'\u3030'
>>> s.decode('unicode-escape').encode('utf8')
'\xe3\x80\xb0'
我不明白为什么(或如何)你有一个字节字符串和Unicode字符串这样的混合体。但如果数据就是这样,那么需要对这两种类型的字符串进行不同的处理

下面的代码首先打印
数据中每个字符串的表示形式以及该字符串所属的对象类型。
然后对普通字节字符串调用
decode('unicode-escape')
方法,将它们转换为unicode字符串。
然后将所有字符串从Unicode编码为UTF-8字节字符串

data = [
    'byte string',
    u'unicode string',
    'this byte string has unicode escapes: \\u2122\\u00e6',
    u'this unicode string has non-ascii chars: ©æ™ä',
]

for s in data:
    print repr(s), type(s)
    if isinstance(s, str):
        s = s.decode('unicode-escape')
    z = s.encode('utf8')
    print repr(z), z
    print
输出

'byte string' <type 'str'>
'byte string' byte string

u'unicode string' <type 'unicode'>
'unicode string' unicode string

'this byte string has unicode escapes: \\u2122\\u00e6' <type 'str'>
'this byte string has unicode escapes: \xe2\x84\xa2\xc3\xa6' this byte string has unicode escapes: ™æ

u'this unicode string has non-ascii chars: \xa9\xe6\u2122\xe4' <type 'unicode'>
'this unicode string has non-ascii chars: \xc2\xa9\xc3\xa6\xe2\x84\xa2\xc3\xa4' this unicode string has non-ascii chars: ©æ™ä
“字节字符串”
“字节字符串”字节字符串
u'unicode字符串'
“unicode字符串”unicode字符串
'此字节字符串具有unicode转义:\\u2122\\u00e6'
'此字节字符串具有unicode转义:\xe2\x84\xa2\xc3\xa6'此字节字符串具有unicode转义:™æ
u'此unicode字符串具有非ascii字符:\xa9\xe6\u2122\xe4'
'此unicode字符串具有非ascii字符:\xc2\xa9\xc3\xa6\xe2\x84\xa2\xc3\xa4'此unicode字符串具有非ascii字符:)™ä
上面的输出是在一个配置为使用UTF-8的终端中生成的。

我不明白为什么(或如何)会出现这样的字节字符串和Unicode字符串的混合。但如果数据就是这样,那么需要对这两种类型的字符串进行不同的处理

下面的代码首先打印
数据中每个字符串的表示形式以及该字符串所属的对象类型。
然后对普通字节字符串调用
decode('unicode-escape')
方法,将它们转换为unicode字符串。
然后将所有字符串从Unicode编码为UTF-8字节字符串

data = [
    'byte string',
    u'unicode string',
    'this byte string has unicode escapes: \\u2122\\u00e6',
    u'this unicode string has non-ascii chars: ©æ™ä',
]

for s in data:
    print repr(s), type(s)
    if isinstance(s, str):
        s = s.decode('unicode-escape')
    z = s.encode('utf8')
    print repr(z), z
    print
输出

'byte string' <type 'str'>
'byte string' byte string

u'unicode string' <type 'unicode'>
'unicode string' unicode string

'this byte string has unicode escapes: \\u2122\\u00e6' <type 'str'>
'this byte string has unicode escapes: \xe2\x84\xa2\xc3\xa6' this byte string has unicode escapes: ™æ

u'this unicode string has non-ascii chars: \xa9\xe6\u2122\xe4' <type 'unicode'>
'this unicode string has non-ascii chars: \xc2\xa9\xc3\xa6\xe2\x84\xa2\xc3\xa4' this unicode string has non-ascii chars: ©æ™ä
“字节字符串”
“字节字符串”字节字符串
u'unicode字符串'
“unicode字符串”unicode字符串
'此字节字符串具有unicode转义:\\u2122\\u00e6'
'此字节字符串具有unicode转义:\xe2\x84\xa2\xc3\xa6'此字节字符串具有unicode转义:™æ
u'此unicode字符串具有非ascii字符:\xa9\xe6\u2122\xe4'
'此unicode字符串具有非ascii字符:\xc2\xa9\xc3\xa6\xe2\x84\xa2\xc3\xa4'此unicode字符串具有非ascii字符:)™ä

上述输出是在配置为使用UTF-8的终端中产生的。

正如mhawke的回答所示,您需要颠倒操作顺序。首先解码包含Unicode转义序列的字节字符串,然后将生成的Unicode编码为UTF-8字节字符串。我仍然不确定您的问题是什么,但希望我的答案有帮助。:)正如mhawke的回答所示,您需要颠倒操作顺序。首先解码包含Unicode转义序列的字节字符串,然后将生成的Unicode编码为UTF-8字节字符串。我仍然不确定您的问题是什么,但希望我的答案有帮助。:)谢谢你的回答,但这个对我不起作用。我可以有一个类似于
u'a'
的输入,然后在转换为“utf-8”之前尝试解码unicode escape时会出现异常:
UnicodeEncodeError:“ascii”编解码器无法对0位置的字符u'\xe4'进行编码:序号不在范围内(128)
@Valentina:在你的问题中,输入数据是字节字符串,不是带有
u
前缀的Unicode字符串。您应该编辑您的问题,以便我们知道您的真实数据是什么样子。@PM 2是我的错,对不起。编辑了这篇博文谢谢你的回答,但这篇对我不适用。我可以有一个类似于
u'a'
的输入,然后在转换为“utf-8”之前尝试解码unicode escape时会出现异常:
UnicodeEncodeError:“ascii”编解码器无法对0位置的字符u'\xe4'进行编码:序号不在范围内(128)
@Valentina:在你的问题中,输入数据是字节字符串,不是带有
u
前缀的Unicode字符串。您应该编辑您的问题,以便我们知道您的真实数据是什么样子。@PM 2是我的错,对不起。编辑帖子谢谢!这似乎正是我需要做的。我试试看。谢谢!这似乎正是我需要做的。我会努力的。