2011-05-09 101 views
1

作爲Django網站的一部分,用戶可以輸入街道名稱,並將條目添加到Google地圖地理編碼鏈接中。一切運作良好,直到用戶輸入特殊字符。與Python中的unicode混淆

我想顯示鏈接中的特殊字符,但python用unicode符號替換字符。 有沒有辦法阻止python切換到unicode,並簡單地採取用戶輸入?我嘗試了幾種解碼器和格式,但它沒有解決問題。

編輯:代碼編程在Python 2

我現在請求JSON迴應如下:

url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + 
      addressString.decode('ascii') + "&sensor=false"; 
    googleResponse = urllib.urlopen(url); 

謝謝您的幫助和建議。

+2

你需要指定這是python2還是python3,因爲unicode處理在Python3中得到了顯着改進 – ninjagecko 2011-05-09 12:13:09

+0

你是否希望Unicode字符在URL中顯示爲真實字符(即不是百分號序列)?因爲這取決於瀏覽器,而不是Python。大多數現代瀏覽器應將這些序列轉換爲Unicode,但不能在URL中直接使用Unicode - 該標準僅允許使用ASCII。 – 2011-05-09 12:16:42

+0

@ninjagecko:http://docs.djangoproject.com/en/dev/faq/install/#can-i-use-django-with-python-3 – 2011-05-09 12:18:16

回答

5

首先,檢查addressString是一個Unicode對象(這是如果你使用Python 3,或者如果type(addressString)顯示'unicode')。如果是,那麼你可能需要嘗試以下方法:

url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + 
     urllib.quote(addressString.encode('utf-8')) + "&sensor=false"; 

如果addressString是一個(非Unicode)字符串對象(在Python 2)或字節的對象(在Python 3),那麼它必須是已經以UTF-8編碼。在這種情況下,請嘗試以下操作:

url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + 
     urllib.quote(addressString) + "&sensor=false"; 

這些片斷都應該在Unicode字符轉換爲使用%跡象URL轉義序列。這是在URL中使用非ASCII字符的標準方式。現代瀏覽器應該解碼這些序列,將它們顯示爲Unicode字符。

+0

我試過你的例子 - 謝謝你的提交 - 但我仍然得到相同的錯誤信息:'異常類型:UnicodeEncodeError 異常值:'ascii'編解碼器無法編碼字符u'\ xdf'在位置10:序號請求鏈接時不在範圍(128)內。我想我需要進一步研究這個問題。感謝您提交。 – neurix 2011-05-09 12:38:31

+1

你嘗試過嗎?你有沒有檢查什麼樣的對象addressString?它是如何編碼的?如果不知道這些細節,我們無法回答您。 – 2011-05-09 12:40:38

+1

@neurix:也可以按照John Machin的建議嘗試'print repr(addressString)'。 – 2011-05-09 12:41:21

0

不肯定,請嘗試:

URL = 「http://maps.googleapis.com/maps/api/geocode/json?address=」 +
addressString.decode(「UTF-8 ')+「& sensor = false」;
googleResponse = urllib.urlopen(url);

+0

我也試過 - 沒有任何運氣。 – neurix 2011-05-09 12:19:08

+0

urllib.urlopen()不採用unicode。您需要使用UTF-8對其進行編碼,然後以百分號進行編碼 - 請參閱@Boaz Yaniv的答案。 – 2011-05-09 12:34:51

2

[大發評論,因爲意見不能被格式化以及]

繼@Boaz的Yaniv的指令工作對我來說:

>>> addressString = 'Wilhelmstra\xc3\x9fe 123, T\xc3\xbcbingen, Deutschland' 

這是一個str ojbject,在UTF-8編碼。我們需要百分比轉義它,以便它可以在URL中使用。

>>> import urllib 
>>> fixed = urllib.quote(addressString) 
>>> print repr(fixed) 
'Wilhelmstra%C3%9Fe%20123%2C%20T%C3%BCbingen%2C%20Deutschland' 

現在,讓我們嘗試一下:

>>> url = "http://maps.googleapis.com/maps/api/geocode/json?address=" + fixed + 
"&sensor=false" 
>>> guff = urllib.urlopen(url).read() 
>>> import json 
>>> print repr(json.loads(guff)['results'][0]['formatted_address']) 
u'Wilhelmstra\xdfe 123, 72074 T\xfcbingen, Germany' 
>>> 

如果你有這樣的事情:'Wilhelmstra\xdfe 123, T\xfcbingen, Deutschland',這是在LATIN1或CP1252或任何編碼的str對象。你需要將它解碼爲一個unicode對象,然後使用UTF-8對其進行編碼,然後百分比轉義。

但是,如果你有(很微妙的差異)u'Wilhelmstra\xdfe 123, T\xfcbingen, Deutschland',這是一個unicode對象,你需要用UTF-8編碼,然後百分號轉義它。

你說的「」「 我仍然得到相同的錯誤信息:異常類型:UnicodeEncodeError異常值:'ascii'編解碼器無法編碼字符u'\ xdf'在位置10:序號不在範圍內(128)請求鏈接 「」」

時,這看起來像你喂unicode對象一些東西,想要一個str對象,並嘗試使用(通常默認)ascii編碼編碼得到它。如果你仍然有這個問題,請顯示你的代碼。將其分解到必要的最小值(正如我上面所做的那樣)。顯示repr(step_by_step_results)。