Python UTF16波浪形破折号编码问题/问题

2024-05-16 07:38:11 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我在做一些工作,遇到了一个问题,“看起来很有趣”。我一直在将一些字符串数据解释为utf-8,并检查编码的形式。数据通过pythonldap来自ldap(特别是activedirectory)。没有惊喜。在

所以我多次遇到字节序列'\xe3\x80\xb0',当解码为utf-8时,它是unicode码位3030(wavy dash)。需要转换成16.utf格式的字符串('16.utf。不幸的是,python似乎不喜欢这个字符:

D:\> python
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> u"\u3030"
u'\u3030'
>>> u"\u3030".encode("utf-8")
'\xe3\x80\xb0'
>>> u"\u3030".encode("utf-16-le")
'00'
>>> u"\u3030".encode("utf-16-be")
'00'
>>> '\xe3\x80\xb0'.decode('utf-8')
u'\u3030'
>>> '\xe3\x80\xb0'.decode('utf-8').encode('utf-16')
'\xff\xfe00'
>>> '\xe3\x80\xb0'.decode('utf-8').encode('utf-16-le').decode('utf-8')
u'00'

看来IronPython也不是粉丝:

^{pr2}$

如果有人能告诉我这里到底发生了什么,我将不胜感激。在


Tags: 数据字符串le编码ldap形式utfpythonldap
3条回答

你被两件事弄糊涂了(我也被甩了):

  1. utf-16和utf-32编码使用BOM,除非您通过utf-16-be等指定使用哪个字节顺序。这是最后第二行中的\xff\xfe。在
  2. “00”是两个字符digit zero。它不是空字符。反正打印方式不同:

    >>> '\0\0'
    '\x00\x00'
    

这似乎是正确的行为。在UTF-16中编码的字符u'\u3030'与UTF-8中的“00”编码相同。看起来很奇怪,但它是对的。在

您可以看到的'\xff\xfe'只是一个Byte Order Mark。在

你确定你想要波浪形破折号,而不是其他字符?如果你希望有一个不同的字符,那可能是因为它在进入你的应用程序之前已经被错误地编码了。在

但它可以解码:

>>> u"\u3030".encode("utf-16-le")
'00'
>>> '00'.decode("utf-16-le")
u'\u3030'

这个字符的UTF-16编码恰好与“0”的ASCII代码一致。也可以用'\x30\x30'来表示它:

^{pr2}$

相关问题 更多 >