尝试对 Python 中的 google 字体进行 base64 编码时出现问题

Problems when trying to base64-encode google fonts in Python

我正在尝试从 Google 字体中提取一些字体,我只需要进入每个字体名称的字母以该字体显示,所以我使用 text=FontName 查询优化了查询取回小文件的参数。没问题。

我的挑战是我想将每个@font-face 合并到一个 css 文件中并对字体文件进行 base64 编码,但我似乎无法在 Python.

我不知道有什么好的方法可以解决 base64 编码问题,但我所做的是下载字体文件并将它们上传到 FontSquirrel 的 Webfont Generator 并下载按预期工作的 base64 编码版本。然后我将它们与我的编码的相应 ASCII 表示进行了比较,并得出结论认为它们不可比 - 所以有些地方不对。

这是我的代码:

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

import base64, urllib2

font_names = ['Lobster', 'Pacifico', 'Acme']
base_url = 'https://fonts.googleapis.com/css?family='

def get_url(url_string):
    return url_string.split('url(')[1].split(')')[0]

def get_format(url_string):
    return ' format(' +  url_string.split('format(')[1]

font_lines = []
for font in font_names:
    font_url = base_url + font + '&text=' + font
    # font_face = urllib2.urlopen(font_url).read()

    for line in urllib2.urlopen(font_url):
        if 'src:' in line:
            url = get_url(line)
            font_format = get_format(line)
            base64_font = base64.b64encode(urllib2.urlopen(url).read())
            font_lines.append('src: url(data:font/ttf; base64, ' + base64_font + ')' + font_format)
        else:
            font_lines.append(line)

with open('fonts.css', 'w') as font_file:
    for line in font_lines:
        font_file.write(line)

顺便说一句,我通过简单地打开我从原始字体请求到 Google 字体的 @font-face 表达式中的 src 属性中的 URL,获得了要上传到 Fontsquirrel 的文件。在浏览器中打开它们时,会下载文件。

所以,为了说明,我的 Lobster 字体的 base64 编码版本的开头如下所示:

AAEAAAAQAQAABAAAR1BPU0R0THUAAAEUAAAAHkdTVUJl3GDLAAAE

Fontsquirrel 使用 base64 编码的相同字体如下所示:

AAEAAAASAQAABAAgRkZUTY3tsD4AAAEsAAAAHEdERUYAJwAgAAABSAAAAB5HUE9TI5w

奇怪的是,它们一开始看起来一样,然后就开始不同了。我在 Windows 7 机器上完成了编码。谢谢

我找到了解决办法。 而不是:

base64.b64encode(s)

我必须使用:

base64.standard_b64encode(s)

从文档中看不是特别清楚,但显然 b64encode 方法没有使用标准的 Base64 字母表。它说它使用 Base64,我认为它与标准 Base64 字母表相同。但显然不是。无论如何,standard_b64encode 方法使用标准的 Base64 字母表,在这种情况下似乎可以解决问题。

我不清楚为什么可以使用 b64encode 方法编码图像,而我必须使用 standard_b64encode 方法才能使它用于字体文件。无论如何,它现在起作用了——我很高兴。希望这也可以帮助其他人。干杯!