Python: URL 用拉丁字符编码 url
Python: URL encode urls with latin characters
我在数据库中有许多具有 "url" 属性的实体,这么多记录中的 url 属性是硬编码的,即包含拉丁字符,这在 Firefox 中不起作用(urls 是存储在 s3 中的歌曲文件,我用 soundmanager2 播放它们。
示例:
url with latin character "ó": https://something.s3.amazonaws.com/music/something/thisó.mp3
如果我用它的 utf8 代码“%c3%b3”替换“ó”,那么 https://something.s3.amazonaws.com/music/something/this%c3%b3.mp3
有效
我想用基于 this chart
的 url 编码 utf8 代码替换所有拉丁字符和特殊字符
正如@albert 所问,我发布了我找到的解决方案。使用 "urllib" 的 "quote" 方法,您可以编码拉丁语和字符,如 " "、"(" 和所有其他特殊字符。因为 "quote" 会将 "http:" 转换为 "http%3A" 这是不需要的,必须拆分 url 并且只转换想要的部分。另一件你应该考虑的事情是 url 是否已经部分或完全编码,在这种情况下,url 可能包含一些 utf8 编码的字符,其中包含“%”,引号会将“%”作为特殊字符进行处理,并将其转换为“%25”,这会使 url 混乱s 到不返回的混乱!
案例示例:
If the url is url = "http://something/cóntaining space song name.mp3"
如果 url 已经部分编码(例如“ ”将是“%20”),那么当前的 url 可能看起来像这样
url = "http://something/cóntaining%20space%20song%20name.mp3"
urllib.quote(url) 将给出(假设 "http:" 未转换为 "http:%3A") urllib.quote 将给出:
"http://something/c%C3%B3ntaining%2520space%2520song%2520name.mp3"
结果一团糟!
话虽这么说;我们不能将 url 拆分为 "http:" 和其余部分,然后将 "quote" 应用于 url.
的第二部分
所以解决方案;将这些特殊字符一一编码;用它的 utf 代码替换每个拉丁字符或特殊字符。那么问题来了"How ?"
如果每个 url 都包含由这些字符组成的列表中的一个字符(另一件事,如果 url 是 unicode 你不能使用 url.find ("ó")), 那么技巧来了!问题就是解决方案!
寻找拉丁字符和特殊字符!如何找到他们?!除了 !
如果 urls(包含错误字符)属于 "unicode" 类型,将它们转换为字符串将引发异常
如果 urls(包含错误字符)属于 "str" 类型,将它们转换为 unicode 将引发异常
我们找到了想要的字符,但有例外 ;-)
然后在那个字符的位置拆分url,引用字符,最后重建url。
就我而言,urls 是 unicode:
import sys
import urllib
from core.models import Song
songs = Song.objects.all()
for song in songs:
try:
x = str(song.song_url) #will cause exception with urls containing bad characters
except(UnicodeEncodeError):
k = sys.exc_info()
pos = k[1][2] #getting the position of the bad character
c = song.song_url[pos].encode("utf8")
q = urllib.quote(c)
p1 = song.song_url[:pos] #splitted part one
p2 = song.song_url[pos+1:] #splitted part two
res = p1 + q + p2 #rebuit url
song.song_url = res
song.save()
print res
注意如果url中包含多个"bad"字符,上面的代码会处理每个url中的第一个,所以无论是递归执行还是运行 多次直到你没有输出。
希望对您有所帮助。
一般示例,其中 url 的类型为 "str":
import sys
import urllib
url = "https://something.s3.amazonaws.com/music/something/thisó.mp3"
try:
x = unicode(url)
except(UnicodeDecodeError):
k = sys.exc_info()
pos = k[1][2]
url2 = url.decode('utf8')
c = url2[pos].encode("utf8")
q = urllib.quote(c)
p1 = url2[:pos]
p2 = url2[pos+1:]
res = p1 + q + p2
print res
我希望这个解决方案对遇到的任何人都有帮助。
我在数据库中有许多具有 "url" 属性的实体,这么多记录中的 url 属性是硬编码的,即包含拉丁字符,这在 Firefox 中不起作用(urls 是存储在 s3 中的歌曲文件,我用 soundmanager2 播放它们。
示例:
url with latin character "ó": https://something.s3.amazonaws.com/music/something/thisó.mp3
如果我用它的 utf8 代码“%c3%b3”替换“ó”,那么 https://something.s3.amazonaws.com/music/something/this%c3%b3.mp3
有效
我想用基于 this chart
的 url 编码 utf8 代码替换所有拉丁字符和特殊字符正如@albert 所问,我发布了我找到的解决方案。使用 "urllib" 的 "quote" 方法,您可以编码拉丁语和字符,如 " "、"(" 和所有其他特殊字符。因为 "quote" 会将 "http:" 转换为 "http%3A" 这是不需要的,必须拆分 url 并且只转换想要的部分。另一件你应该考虑的事情是 url 是否已经部分或完全编码,在这种情况下,url 可能包含一些 utf8 编码的字符,其中包含“%”,引号会将“%”作为特殊字符进行处理,并将其转换为“%25”,这会使 url 混乱s 到不返回的混乱!
案例示例:
If the url is url = "http://something/cóntaining space song name.mp3"
如果 url 已经部分编码(例如“ ”将是“%20”),那么当前的 url 可能看起来像这样
url = "http://something/cóntaining%20space%20song%20name.mp3"
urllib.quote(url) 将给出(假设 "http:" 未转换为 "http:%3A") urllib.quote 将给出:
"http://something/c%C3%B3ntaining%2520space%2520song%2520name.mp3"
结果一团糟!
话虽这么说;我们不能将 url 拆分为 "http:" 和其余部分,然后将 "quote" 应用于 url.
的第二部分所以解决方案;将这些特殊字符一一编码;用它的 utf 代码替换每个拉丁字符或特殊字符。那么问题来了"How ?"
如果每个 url 都包含由这些字符组成的列表中的一个字符(另一件事,如果 url 是 unicode 你不能使用 url.find ("ó")), 那么技巧来了!问题就是解决方案!
寻找拉丁字符和特殊字符!如何找到他们?!除了 !
如果 urls(包含错误字符)属于 "unicode" 类型,将它们转换为字符串将引发异常
如果 urls(包含错误字符)属于 "str" 类型,将它们转换为 unicode 将引发异常
我们找到了想要的字符,但有例外 ;-)
然后在那个字符的位置拆分url,引用字符,最后重建url。
就我而言,urls 是 unicode:
import sys
import urllib
from core.models import Song
songs = Song.objects.all()
for song in songs:
try:
x = str(song.song_url) #will cause exception with urls containing bad characters
except(UnicodeEncodeError):
k = sys.exc_info()
pos = k[1][2] #getting the position of the bad character
c = song.song_url[pos].encode("utf8")
q = urllib.quote(c)
p1 = song.song_url[:pos] #splitted part one
p2 = song.song_url[pos+1:] #splitted part two
res = p1 + q + p2 #rebuit url
song.song_url = res
song.save()
print res
注意如果url中包含多个"bad"字符,上面的代码会处理每个url中的第一个,所以无论是递归执行还是运行 多次直到你没有输出。 希望对您有所帮助。
一般示例,其中 url 的类型为 "str":
import sys
import urllib
url = "https://something.s3.amazonaws.com/music/something/thisó.mp3"
try:
x = unicode(url)
except(UnicodeDecodeError):
k = sys.exc_info()
pos = k[1][2]
url2 = url.decode('utf8')
c = url2[pos].encode("utf8")
q = urllib.quote(c)
p1 = url2[:pos]
p2 = url2[pos+1:]
res = p1 + q + p2
print res
我希望这个解决方案对遇到的任何人都有帮助。