2010-02-19 29 views
1

我在嘗試將正則表達式應用於以拉丁-1(ISO-8859-1)編碼的某些字符串時遇到問題。嘗試讀取latin-1編碼字符串時,'python'中的'ASCII'轉換爲Unicode錯誤

我想要做的是通過HTTP POST從ISO-8859-1編碼的頁面發送一些數據到我的python應用程序,並在我的python腳本中使用正則表達式對數據進行一些解析。

網頁使用jQuery將數據發送到服務器,我使用.text()方法從頁面抓取文本。一旦數據發送回服務器看起來像這樣:re.compile(r"^[\s,]*(\d*\s*\d*\/*\d)[\s,]*") - 不幸的是我的正則表達式中的\s與我的數據不匹配,並且我將問題追溯到html頁面使用 這一事實,該頁面被編碼爲0xA0(非 - 破壞空間)併發送到服務器。出於某種原因,看起來,我的腳本沒有將該字符解釋爲空白,並且不匹配。根據python [文檔] [1]看起來這應該起作用,所以我必須在這裏有一個編碼問題。

然後我想嘗試將字符串轉換爲unicode並將其傳遞給正則表達式,所以我試圖查看當我轉換字符串時會發生什麼:print(unicode(data, 'iso-8859-1'))

不幸的是,我得到這個錯誤: UnicodeEncodeError at /script/ 'ascii' codec can't encode character u'\xa0' in position 122: ordinal not in range(128)

我很困惑,但 - 我顯然不嘗試使用ASCII解碼 - 被蟒蛇嘗試使用即使我明明路過另一ASCII編碼解碼器解碼?

+1

你應該紀念的一個這些解決方案被接受,如果他們已經回答了您的問題 – 2010-02-19 07:25:44

+0

謝謝,作爲n00b我昨晚一直在尋找'接受'或'回答'按鈕,但沒有發現。多一點刺激導致我發現了複選標記。 – Simon 2010-02-19 17:46:39

回答

1

你使用Python 3.X還是2.X?它有所作爲。其實看起來像2.X,但你通過使用print(blahblah)困惑我:-)

回答你的最後一個問題:是的,當你做print()時默認爲ASCII。在3.X上:使用print(ascii(foo))進行調試,而不是print(foo)。在2.X上使用repr(),而不是ascii()

你原來的問題與無間斷空間應該走開如果(a)中的數據是unicode及(b)您使用re.UNICODE標誌與re.compile()

+0

是的,2.6-感謝'repr()'技術。 回覆:原來的問題 - 're.UNICODE'就是訣竅 - 謝謝! – Simon 2010-02-19 07:06:44

2

試試這個:通過打印你含蓄試圖將它轉換爲默認編碼,這是ASCII一個Unicode對象

print(repr(unicode(data, 'iso-8859-1'))) 

。使用repr會將其轉換爲ASCII安全形式,此外,您可以更輕鬆地找出調試過程中發生的情況。

+0

謝謝,那很有幫助! – Simon 2010-02-19 07:07:30

+0

+1,但請注意,這現在很有用,但不是全局的。如果你想避免這些問題,你最好開始學習編碼。 – 2010-02-19 08:23:45

+0

我不確定我是否理解你的觀點 - 有用的部分是理解print()會隱式轉換爲默認編碼。 – Simon 2010-02-19 17:44:45

相關問題