1

我在数据库中有许多具有“url”属性的实体,这么多记录中的 url 属性是硬编码的,即包含拉丁字符,这在 Firefox 中不起作用(这些 url 用于存储在 s3 中的歌曲文件,我播放它们与声音管理器2)。

例子:

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

我想根据此图表用他们的 url 编码 utf8 代码替换所有拉丁字符和特殊字符

4

1 回答 1

1

正如@albert 所问,我正在发布我找到的解决方案。使用“urllib”的“quote”方法,您可以编码拉丁文和字符,如“”、“(”和所有其他特殊字符。因为“quote”会将“http:”转换为“http%3A”,这是不需要的, 必须拆分 url 并且只转换想要的部分。您应该考虑的另一件事是,如果 url 已经部分或完全编码,在这种情况下,url 可能包含一些 utf8 编码字符,其中包含“%” ,引号将“%”作为特殊字符进行,并将其转换为“%25”,这会将网址弄乱成不返回的混乱!

案例示例:

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 代码替换每个拉丁字符或特殊字符。然后是“如何?”的问题。

尝试每个 url 是否包含由这些字符组成的列表中的一个字符是很痛苦的(另一件事,如果 url 是 unicode 你不能使用 url.find("ó")),那么技巧来了!问题就是解决方案!

寻找拉丁文和特殊字符!怎么找到他们?!有这个特例 !

如果 url(包含坏字符)是“unicode”类型,将它们转换为字符串将引发异常

如果 url(包含坏字符)是“str”类型,将它们转换为 unicode 将引发异常

我们找到了想要的字符,但有例外 ;-)

然后在该字符的位置拆分 url,引用字符并在最后重建 url。

就我而言,网址是 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 包含多个“坏”字符,上面的代码将处理每个 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

我希望该解决方案对遇到的任何人都有帮助。

于 2015-09-04T00:58:30.087 回答