簡體   English   中英

Python:打開帶有重音符號的URL

[英]Python: open a URL with accent

在Python 2.7中,我想打開一個包含重音符號的URL( 鏈接本身 ,而不是它指向的頁面)。 如果我使用以下內容:

#!/usr/bin/env Python
# -*- coding: utf-8 -*-

import urllib2


test = "https://www.notifymydevice.com/push?ApiKey=K6HGFJJCCQE04G29OHSRBIXI&PushTitle=Les%20accents%20:%20éèçà&PushText=Messages%20éèçà&"

urllib2.urlopen(test)

我的口音轉換為胡言亂語(Ã,¨,©等,而不是我期望的éèà)。

我已經搜索過此類問題,因此嘗試使用urllib2.urlopen(test.encode('utf-8')),但Python在這種情況下會引發錯誤:

urllib2.urlopen(test.encode('utf8'))中的文件“ test.py”,第10行,UnicodeDecodeError:“ ascii”編解碼器無法解碼位置98的字節0xc3:序數不在范圍內(128)

u前綴字符串。 我沒有錯誤嘗試使用repl

import urllib
test = u'https://www.notifymydevice.com/push?ApiKey=K6HGFJJCCQE04G29OHSRBIXI&PushTitle=Les%20accents%20:%20éèçà&PushText=Messages%20éèçà&'
urllib.urlopen(test.encode("UTF-8"))

u前綴用於unicode字符串

如果你調用encode一個str ,Python有先譯碼后, unicode ,因此它可以編碼統一為UTF-8。 為了解碼它,它必須猜測您使用了哪種編碼,因為您沒有告訴它。 因此,它猜測為'ascii' (實際上,它猜測sys.getdefaultencoding()所說的內容,但這通常是'ascii' ),但失敗了。

無論如何,這里有兩個可能的問題,有不同的解決方案。 因此,在嘗試修復該問題之前,您需要先確定自己擁有哪一個。


嘗試打印出字符串的各個字節,或更簡單地說,是repr

print repr(test)
  • 如果é顯示為\\xc3\\xa9\\xc3\\xa9 UTF-8。
  • 如果顯示為\\xe9\\xe9 Latin-1(或cp1252或與Latin-1兼容的其他名稱)。
  • 如果它顯示為其他字符,則它是一個不同的字符集,您必須確定哪個字符集。

如果您要提供Python Latin-1源碼並告訴它是UTF-8,它不會發牢騷,但這意味着您將在您認為自己正在發送UTF-8字符的地方發送Latin-1字節,並且到處都會得到mojibake。

解決方法是在文本編輯器中將源代碼另存為UTF-8。


如果已經 UTF-8,則問題在於服務器不希望URL為UTF-8。

URL標准對( %編碼的)非ASCII字節沒有強制要求任何特殊含義; 任何服務器都可以對它們執行任何操作。 而且,如果您正在與將此類字節視為cp1252的服務器進行通信,但要發送的是UTF-8,則將獲得mojibake。

解決此問題的方法是,如果您控制服務器,則將服務器重新配置為處理UTF-8,如果不需要,則以服務器所需的字符集發送字符串。

暫無
暫無

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

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