Css 如何修复QtWebKit';错误的字体回退行为?

Css 如何修复QtWebKit';错误的字体回退行为?,css,qt,qtwebkit,Css,Qt,Qtwebkit,我有一个网站,其中一些网页有用户生成的内容。我使用phantomjs(基于QtWebKit)拍摄页面截图,所以它们必须在QtWebKit中完美呈现 当内容不是英语时,问题就开始了。然后,流行浏览器(如Chrome和Firefox)会退回到CSS字体系列中的下一种字体,直至默认字体。然而,在我的测试中,QtWebKit似乎表现出不同的行为:它错误地选择了无法呈现内容的字体 考虑这个示例文件“fonts.html”: calibri,arial: ฝ่ายอีเว้นท์พร้อมแล้วกับงา

我有一个网站,其中一些网页有用户生成的内容。我使用phantomjs(基于QtWebKit)拍摄页面截图,所以它们必须在QtWebKit中完美呈现

当内容不是英语时,问题就开始了。然后,流行浏览器(如Chrome和Firefox)会退回到CSS字体系列中的下一种字体,直至默认字体。然而,在我的测试中,QtWebKit似乎表现出不同的行为:它错误地选择了无法呈现内容的字体

考虑这个示例文件“fonts.html”:

calibri,arial:
ฝ่ายอีเว้นท์พร้อมแล้วกับงานปาร์ตี้ที่สนุกที่สุดในกทม
卡里布里:
ฝ่ายอีเว้นท์พร้อมแล้วกับงานปาร์ตี้ที่สนุกที่สุดในกทม
arial:
ฝ่ายอีเว้นท์พร้อมแล้วกับงานปาร์ตี้ที่สนุกที่สุดในกทม
违约:
ฝ่ายอีเว้นท์พร้อมแล้วกับงานปาร์ตี้ที่สนุกที่สุดในกทม
以下是它在Chrome和Arora(一种基于QtWebKit的浏览器,它可以为我的phantomjs脚本提供相同的结果)中的呈现方式:

我想要的是文本以Calibri格式呈现,如果不适合某些字符,可以使用Arial格式


我将接受一个解决方案,该解决方案告诉我如何配置QtWebKit以允许此操作(我在web上找不到任何内容),或者如何将我的HTML/CSS更改为“支持QtWebKit”。

如果问题是所选字体不包含指定字符,我建议您将字体嵌入网站。这样,您就可以确保每个平台都能够呈现您的内容

你说Chrome没有你错误描述的行为。所以原因一定是在旧的WebKit实现中。您可以尝试更新到Qt5,它使用WebKit2.0,比如谷歌Chrome。Qt4.x使用旧的WebKit 1.x版本


修正WebKit代码是一个非常糟糕的主意。代码库大约有200万LOC,您需要一个64位的工具链来编译QtWebKit模块。如果不严格按照说明操作,也很可能会出现编译器错误。由于GIF图像渲染器中的一个错误,我不得不自己调试WebKit代码。这才是真正的地狱;)

其他研究:我试图通过使用CSS
@font-face{url:local('calibri')}
unicode范围
描述符指定“MyCalibri”来解决这个问题,该描述符只能加载英文字符,但我找不到QtWebKit允许的任何语法。我安装了Arora,并且我没有看到您的演示中存在的问题。你能提供一个实时页面或更好的演示吗?a.M.K-你在使用Windows 7/你安装了Calibri字体吗?我实际上在Windows 8中,是的,我确实安装了Calibri。我猜你有一个带泰语的高级Calibri,我有没有泰语的Calibri。用您安装的truetype字体替换(在上面的html中)Calibri,该字体为英语而非泰语,您应该会看到问题所在。谢谢您的回答。字体嵌入在我的网站中-问题是QtWebKit浏览器(phantomjs)不会回退到CSS字体堆栈中(例如)泰国字符的下一种字体。关于从Qt4升级到Qt5,由于我只是使用phantomjs(两个版本之前,phantomjs决定将Qt代码库导入phantomjs项目),问题从“调试QtWebKit”变为“调试phantomjs”(升级到Qt5是phantomjs组中广泛要求的功能,我并不特别想承担这项可能不平凡的任务)。
calibri, arial:
<div style="font-family: calibri, arial; font-size: 36px;">
ฝ่ายอีเว้นท์พร้อมแล้วกับงานปาร์ตี้ที่สนุกที่สุดในกทม
</div>

calibri:
<div style="font-family: calibri; font-size: 36px;">
ฝ่ายอีเว้นท์พร้อมแล้วกับงานปาร์ตี้ที่สนุกที่สุดในกทม
</div>

arial:
<div style="font-family: arial; font-size: 36px;">
ฝ่ายอีเว้นท์พร้อมแล้วกับงานปาร์ตี้ที่สนุกที่สุดในกทม
</div>

default:
<div style="font-size: 36px;">
ฝ่ายอีเว้นท์พร้อมแล้วกับงานปาร์ตี้ที่สนุกที่สุดในกทม
</div>