尝试对 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 方法才能使它用于字体文件。无论如何,它现在起作用了——我很高兴。希望这也可以帮助其他人。干杯!
我正在尝试从 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 方法才能使它用于字体文件。无论如何,它现在起作用了——我很高兴。希望这也可以帮助其他人。干杯!