(unicode错误)'unicodeescape'编解码器无法解码字节 - 字符串带'\ u'

时间:2011-09-29 19:06:31

标签: python unicode future-proof

编写我的Python 2.6代码,但考虑到Python 3,我觉得放一个

是个好主意
from __future__ import unicode_literals

在某些模块的顶部。换句话说,我要求麻烦(将来要避免它们),但我可能会遗漏一些重要的知识。我希望能够传递表示文件路径的字符串并实例化一个简单的对象

MyObject('H:\unittests')

Python 2.6 中,这很好用,不需要使用双反斜杠或原始字符串,即使对于以'\u..'开头的目录,这正是我想要的。在__init__方法中,我确保所有单\次出现都被解释为“\\”,包括特殊字符之前的\a\b,{ {1}},\f\n\r\t(仅\v仍有问题)。还使用(本地)编码将给定字符串解码为unicode按预期工作。

准备 Python 3.x ,在编辑器中模拟我的实际问题(从Python 2.6中的干净控制台开始),会发生以下情况:

\x

(确定直到此处:>>> '\u' '\\u' >>> r'\u' '\\u' 由控制台使用本地编码进行编码)

'\u'

换句话说,(unicode)字符串根本不被解释为unicode,也不会使用本地编码自动解码。对于原始字符串也是如此:

>>> from __future__ import unicode_literals
>>> '\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence

>>> r'\u' SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX

u'\u'

另外,我希望>>> u'\u' SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence 返回isinstance(str(''), unicode)(它没有),因为导入unicode_literals应该使所有字符串类型都是unicode。 (编辑:)由于in Python 3, all strings are sequences of Unicode characters,我希望True返回此类unicode字符串,str(''))同时返回type(str('')),并且<type 'unicode'>(因为所有字符串都是unicode),但也意识到<type 'str'>。周围的困惑......

问题

  • 如何才能最好地传递包含“<type 'unicode'> is not <type 'str'>”的字符串? (不写'\u')
  • 是否\\u真正实现了所有与Python 3.相关的unicode更改,以便我获得完整的Python 3字符串环境?

编辑: 在Python 3中, <type 'str'> is a Unicode object from __future__ import unicode_literals根本不存在。在我的情况下,我想编写适用于Python 3的Python 2(.6)代码。但是当我<type 'unicode'>时,我无法检查字符串是否为import unicode_literals,因为:

  • 我认为<type 'unicode'>不是命名空间的一部分
  • 如果unicode是命名空间的一部分,则unicode的文字在同一模块中创建时仍然是unicode
  • <type 'str'>将始终为Python 3中的unicode文字返回type(mystring)

我的模块使用顶部的<type 'str'>注释以'utf-8'编码,而我的# coding: UTF-8返回'cp1252'。因此,如果我从我的控制台调用locale.getdefaultlocale()[1],它在Python 2中编码为'cp1252',在从模块调用MyObject('çça')时编码为'utf-8'。在Python 3中,它不会被编码,而是一个unicode文字。

编辑:

我放弃了允许在MyObject('çça')(或u之前)避免使用'\'的希望。另外,我了解导入x的限制。但是,从模块到控制台传递字符串的许多可能组合,以及每种不同的编码反之亦然,除了导入unicode_literals之外,还有Python 2与Python 3之间的导入,这让我想创建一个通过实际测试概述。因此下表。 enter image description here

换句话说,unicode_literals不会在Python 3中返回type(str('')),而是<type 'str'>,并且似乎可以避免所有Python 2问题。

4 个答案:

答案 0 :(得分:16)

AFAIK,from __future__ import unicode_literals所做的就是使所有字符串文字为unicode类型,而不是字符串类型。那就是:

>>> type('')
<type 'str'>
>>> from __future__ import unicode_literals
>>> type('')
<type 'unicode'>

strunicode仍然是不同的类型,它们的行为与以前一样。

>>> type(str(''))
<type 'str'>

始终属于str类型。

关于r'\u'问题,这是设计使然,因为它相当于没有unicode_literals的ru'\ u'。来自文档:

  

当'r'或'R'前缀与'u'或'U'前缀一起使用时,处理\ uXXXX和\ UXXXXXXXX转义序列,而所有其他反斜杠都留在字符串中。< / p>

可能来自词法分析器在python2系列中的工作方式。在python3中它可以像你(和我)一样工作。

您可以键入反斜杠两次,然后{@ 1}}将不会被解释,但您将获得两个反斜杠!

  

可以使用前面的反斜杠转义反斜杠;但是,两者都保留在字符串

\u

恕我直言,你有两个简单的选择:

  • 不要使用原始字符串,并转义反斜杠(与python3兼容):

    >>> ur'\\u' u'\\\\u'

  • 过于聪明并利用unicode代码点(与python3兼容):

    'H:\\unittests'

答案 1 :(得分:0)

对我来说,此问题与版本不相关,在本例中为numpy

修复:

conda install -f numpy

答案 2 :(得分:-1)

我在Python 3上试试这个:

  

导入os

     

os.path.abspath则(&#34; yourPath&#34)

它已经奏效了!

答案 3 :(得分:-2)

当您编写包含反斜杠的字符串文字时,例如路径(在Windows上)或正则表达式,请使用原始字符串。这就是他们的目的。

相关问题