簡體   English   中英

(unicode錯誤)'unicodeescape'編解碼器無法解碼字節 - 字符串帶'\\ u'

[英](unicode error) 'unicodeescape' codec can't decode bytes - string with '\u'

編寫我的Python 2.6代碼,但考慮到Python 3,我認為這是一個好主意

from __future__ import unicode_literals

在一些模塊的頂部。 換句話說,我要求麻煩(將來要避免它們),但我可能會遺漏一些重要的知識。 我希望能夠傳遞表示文件路徑的字符串並實例化一個簡單的對象

MyObject('H:\\unittests')

Python 2.6中 ,這很好用,不需要使用雙反斜杠或原始字符串,即使對於以'\\u..\u0026#39;開頭的目錄,這正是我想要的。 __init__方法中,我確保所有單個\\都被解釋為' \\\\ ',包括特殊字符之前的那些,如\\a\\b\\f\\n\\r\\t\\v (僅限\\x仍然是一個問題)。 還使用(本地)編碼將給定字符串解碼為unicode按預期工作。

准備Python 3.x ,在編輯器中模擬我的實際問題(從Python 2.6中的干凈控制台開始),會發生以下情況:

>>> '\u'
'\\u'
>>> r'\u'
'\\u'

(好的,直到這里: '\\u\u0026#39;由控制台使用本地編碼進行編碼)

>>> 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

換句話說,(unicode)字符串根本不被解釋為unicode,也不會使用本地編碼自動解碼。 對於原始字符串也是如此:

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

同樣適合u'\\u\u0026#39;

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

此外,我希望isinstance(str(''), unicode)返回True (它沒有),因為導入unicode_literals應該使所有字符串類型unicode。 (編輯:)因為在Python 3中,所有字符串都是Unicode字符序列 ,我希望str(''))返回這樣的unicode-string,並type(str(''))<type 'unicode'><type 'str'> (因為所有字符串都是unicode),但也意識到<type 'unicode'> is not <type 'str'> 周圍的困惑......

問題

  • 如何才能最好地傳遞包含' \\u\u003c/code> '的字符串? (不寫' \\\\u\u003c/code> ')
  • from __future__ import unicode_literals真的實現了所有Python 3.相關的unicode更改,以便我獲得完整的Python 3字符串環境?

編輯:在Python 3中, <type 'str'>是一個Unicode對象<type 'unicode'>根本不存在。 在我的情況下,我想編寫適用於Python 3的Python 2(.6)代碼。但是當我import unicode_literals ,我無法檢查字符串是否為<type 'unicode'> import unicode_literals <type 'unicode'>因為:

  • 我假設unicode不是命名空間的一部分
  • 如果unicode是命名空間的一部分,那么當在同一模塊中創建時, <type 'str'>的文字仍然是unicode
  • 對於Python 3中的unicode文字, type(mystring)將始終返回<type 'str'>

我的模塊用'utf-8' # coding: UTF-8locale.getdefaultlocale()[1] # coding: UTF-8注釋在頂部,而我的locale.getdefaultlocale()[1]返回'cp1252'。 因此,如果我從我的控制台調用MyObject('çça') ,它在Python 2中編碼為'cp1252',在從模塊調用MyObject('çça')時編碼為'utf-8'。 在Python 3中,它不會被編碼,而是一個unicode文字。

編輯:

我放棄了希望被允許避免在u之前使用'\\'(或x為此)。 我也理解導入unicode_literals的局限性。 但是,從模塊到控制台傳遞字符串的許多可能組合,以及每種不同的編碼反之亦然,除了導入unicode_literals和Python 2與Python 3之外,我想通過實際測試創建概述。 因此下表。 在此輸入圖像描述

換句話說, type(str(''))不會在Python 3中返回<type 'str'> ,而是<class 'str'> ,並且似乎可以避免所有Python 2問題。

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\u0026#39;問題,它是設計的,因為它相當於沒有unicode_literals ru'\\ u'。 來自文檔:

當'r'或'R'前綴與'u'或'U'前綴一起使用時,處理\\ uXXXX和\\ UXXXXXXXX轉義序列,而所有其他反斜杠都保留在字符串中。

可能來自詞法分析器在python2系列中的工作方式。 在python3中它可以像你(和我)所期望的那樣工作。

您可以鍵入反斜杠兩次,然后\\u\u003c/code>將不會被解釋,但您將獲得兩個反斜杠!

反斜杠可以使用前面的反斜杠進行轉義; 但是,兩者都留在字符串中

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

恕我直言,你有兩個簡單的選擇:

  • 不要使用原始字符串,並轉義反斜杠(與python3兼容):

    'H:\\\\unittests'

  • 太聰明並利用unicode代碼點(與python3 兼容):

    r'H:\\unittests'

對我來說這個問題與最新的版本有關,在這種情況下是numpy

修理 :

conda install -f numpy

我在Python 3上嘗試這個:

進口口

os.path.abspath則( “yourPath”)

它的工作原理!

當您編寫包含反斜杠的字符串文字時,例如路徑(在Windows上)或正則表達式,請使用原始字符串。 這就是他們的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM