【发布时间】:2019-10-31 15:39:39
【问题描述】:
目前,我的 Python 2.7 代码通过套接字连接接收 <str> 对象。在整个代码中,我们使用<str> 对象、比较等。为了转换为Python 3,我发现套接字连接现在返回<bytes> 对象,这需要我们更改所有像 b'abc' 这样的文字来进行文字比较等。这是很多工作,虽然很明显为什么在 Python 3 中进行了这种更改,但我很好奇是否有任何更简单的解决方法.
假设我通过套接字连接收到<bytes> b'\xf2a27'。有没有一种简单的方法可以将这些<bytes> 转换为<str> 对象,在Python 3.6 中具有相同的转义符?我自己研究了一些解决方案,但无济于事。
a = b'\xf2a27'.decode('utf-8', errors='backslashescape')
以上产生'\\xf2a27' 和len(a) = 7,而不是原来的len(b'\xf2a27') = 3。索引也是错误的,这是行不通的,但它似乎正朝着正确的方向前进。
a = b'\xf2a27'.decode('latin1')
以上产生'òa27',其中包含我想避免的Unicode字符。虽然在这种情况下len(a) = 5 和a[0] == '\xf2' 之类的比较有效,但如果可能的话,我想保持信息在表示中转义。
我是否缺少更优雅的解决方案?
【问题讨论】:
-
你认为你为什么想要
str? -
@StephenRauch:我不认为他们这样做 - 他们只是不想将所有字符串文字重写为字节文字。不幸的是,这是唯一明智的做法。 (搜索和替换?)
-
@Amadan,没错。这个问题本质上是苏格拉底式的。
-
@StephenRauch Amadan 所说的完全是原因,但我希望确保在乐趣开始之前不会错过更简单的解决方案。
-
Python 3 字符串 是 Unicode 字符串;根据定义,您无法避免 Python 3 字符串中的 Unicode 字符。如果您想避免使用非 ASCII 字符转义反斜杠转义,这是可行的;但实际上,如果你这样做,你只是在更深地挖掘漏洞百出的坑,这就是从 Python 2 更改它的原因。理智的解决方案是使用
bytes来表示字节 - 这正是这个单独的数据类型是为了。
标签: python python-3.x string python-2.7 unicode