有没有办法以编程方式确定字体文件是否具有特定的 Unicode 字形?

2023-12-14

我正在开发一个生成 PDF 的项目,其中可以包含相当复杂的数学和科学公式。文本以 Times New Roman 格式呈现,它具有相当不错的 Unicode 覆盖率,但并不完整。我们有一个系统可以用更完整的 Unicode 字体来替换 TNR 中没有字形的代码点(就像大多数“陌生”数学符号),但我似乎找不到查询的方法*.ttf 文件以查看给定字形是否存在。到目前为止,我只是硬编码了一个包含代码点的查找表,但我更喜欢自动解决方案。

我在 ASP.net 下的 Web 系统中使用 VB.Net,但任何编程语言/环境中的解决方案将不胜感激。

编辑:win32 解决方案看起来很棒,但我试图解决的具体情况是在 ASP.Net Web 系统中。有没有办法在不将 Windows API DLL 包含到我的网站中的情况下执行此操作?


这是使用 C# 和 Windows API 的一个过程。

[DllImport("gdi32.dll")]
public static extern uint GetFontUnicodeRanges(IntPtr hdc, IntPtr lpgs);

[DllImport("gdi32.dll")]
public extern static IntPtr SelectObject(IntPtr hDC, IntPtr hObject);

public struct FontRange
{
    public UInt16 Low;
    public UInt16 High;
}

public List<FontRange> GetUnicodeRangesForFont(Font font)
{
    Graphics g = Graphics.FromHwnd(IntPtr.Zero);
    IntPtr hdc = g.GetHdc();
    IntPtr hFont = font.ToHfont();
    IntPtr old = SelectObject(hdc, hFont);
    uint size = GetFontUnicodeRanges(hdc, IntPtr.Zero);
    IntPtr glyphSet = Marshal.AllocHGlobal((int)size);
    GetFontUnicodeRanges(hdc, glyphSet);
    List<FontRange> fontRanges = new List<FontRange>();
    int count = Marshal.ReadInt32(glyphSet, 12);
    for (int i = 0; i < count; i++)
    {
        FontRange range = new FontRange();
        range.Low = (UInt16)Marshal.ReadInt16(glyphSet, 16 + i * 4);
        range.High = (UInt16)(range.Low + Marshal.ReadInt16(glyphSet, 18 + i * 4) - 1);
        fontRanges.Add(range);
    }
    SelectObject(hdc, old);
    Marshal.FreeHGlobal(glyphSet);
    g.ReleaseHdc(hdc);
    g.Dispose();
    return fontRanges;
}

public bool CheckIfCharInFont(char character, Font font)
{
    UInt16 intval = Convert.ToUInt16(character);
    List<FontRange> ranges = GetUnicodeRangesForFont(font);
    bool isCharacterPresent = false;
    foreach (FontRange range in ranges)
    {
        if (intval >= range.Low && intval <= range.High)
        {
            isCharacterPresent = true;
            break;
        }
    }
    return isCharacterPresent;
}

然后,给定一个 char 来检查您想要检查的字符和一个 Font 字体来测试它......

if (!CheckIfCharInFont(toCheck, theFont) {
    // not present
}

使用 VB.Net 的相同代码

<DllImport("gdi32.dll")> _
Public Shared Function GetFontUnicodeRanges(ByVal hds As IntPtr, ByVal lpgs As IntPtr) As UInteger
End Function  

<DllImport("gdi32.dll")> _
Public Shared Function SelectObject(ByVal hDc As IntPtr, ByVal hObject As IntPtr) As IntPtr
End Function  

Public Structure FontRange
    Public Low As UInt16
    Public High As UInt16
End Structure  

Public Function GetUnicodeRangesForFont(ByVal font As Font) As List(Of FontRange)
    Dim g As Graphics
    Dim hdc, hFont, old, glyphSet As IntPtr
    Dim size As UInteger
    Dim fontRanges As List(Of FontRange)
    Dim count As Integer

    g = Graphics.FromHwnd(IntPtr.Zero)
    hdc = g.GetHdc()
    hFont = font.ToHfont()
    old = SelectObject(hdc, hFont)
    size = GetFontUnicodeRanges(hdc, IntPtr.Zero)
    glyphSet = Marshal.AllocHGlobal(CInt(size))
    GetFontUnicodeRanges(hdc, glyphSet)
    fontRanges = New List(Of FontRange)
    count = Marshal.ReadInt32(glyphSet, 12)

    For i = 0 To count - 1
        Dim range As FontRange = New FontRange
        range.Low = Marshal.ReadInt16(glyphSet, 16 + (i * 4))
        range.High = range.Low + Marshal.ReadInt16(glyphSet, 18 + (i * 4)) - 1
        fontRanges.Add(range)
    Next

    SelectObject(hdc, old)
    Marshal.FreeHGlobal(glyphSet)
    g.ReleaseHdc(hdc)
    g.Dispose()

    Return fontRanges
End Function  

Public Function CheckIfCharInFont(ByVal character As Char, ByVal font As Font) As Boolean
    Dim intval As UInt16 = Convert.ToUInt16(character)
    Dim ranges As List(Of FontRange) = GetUnicodeRangesForFont(font)
    Dim isCharacterPresent As Boolean = False

    For Each range In ranges
        If intval >= range.Low And intval <= range.High Then
            isCharacterPresent = True
            Exit For
        End If
    Next range
    Return isCharacterPresent
End Function  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法以编程方式确定字体文件是否具有特定的 Unicode 字形? 的相关文章

  • 由于继承抽象类而禁用设计器?

    我有一个项目的解决方案 那个项目中有 40 或 50 种形式 我制作了 4 个基本形式 所有其他形式都可以继承 所有 4 个基本表单都继承 System Windows Forms Form 几乎 90 的形式继承了前 2 个基本形式之一
  • ASP.Net 4.0 与 TinyMCE 和 XML 编码在回发时重新编码内容

    我有一个基于 ASP NET 4 0 的 CMS 我在其中通过 jQuery 使用 TinyMCE 3 4 来编辑一个文本框 除此之外 我还有其他几个文本框 页面上还有另一个下拉列表 用于控制内容类型 该控件启用了自动回发并设置有关所选项目
  • 在执行 ASP.NET 的 Visual Studio 2008 中未声明“__o”

    在执行 ASP NET MVC 时 我在 Visual Studio 2008 中经常遇到这个恼人的错误 bug 未声明 o 问题是什么 我该如何解决 只需将其添加到页面顶部即可 所以现在我的 ASP Net 内容占位符如下所示
  • ASP.NET AJAX 4.0 客户端数据绑定

    我在 MSDN 杂志上读到了一些有关 ASP NET AJAX 4 0 新功能的文章 主要是客户端数据绑定 我觉得 MSDN 杂志有时包含很多 营销 所以我对真正开发人员的意见很感兴趣 值得吗 您打算使用它吗 Edit 如果有人感兴趣的话
  • ASP.NET 中获取当前域的最佳方法是什么?

    我想知道在 ASP NET 中获取当前域的最佳方法是什么 例如 http www domainname com subdir http www domainname com subdir 应该产生http www domainname co
  • Silverlight 3 工具未显示在 Visual Studio 中

    我下载并安装了Silverlight 3 工具 http go microsoft com fwlink LinkID 143571 我想在 ASP net 页面中使用 Silverlight 服务器控件 但我的工具箱中没有 Silverl
  • 在 ASP.NET 3.5 中使用 ASMX 文件的 WS-Security

    基本上 我需要设置 ASMX 文件 以便当我在浏览器中将其拉出以显示 WebMethod 规范时 Soap 标头符合以下格式
  • idleTimeout 和 ShutdownTimeout 之间的区别

    我正在尝试放宽网站的会话过期策略 以便用户可以指定会话超时间隔 我需要弄清楚应该指定哪些网站相关设置 以免过多限制用户 例如 可能需要 1 天的间隔 我将使用门票来实现这一点 现在 我知道我可以在网站的 web config 文件中指定id
  • raku 可以避免这个 Malformed UTF-8 错误吗?

    当我运行这个 raku 脚本时 my proc run tree du out proc out slurp close say 我在 MacOS 上遇到此错误 Malformed UTF 8 near bytes ef b9 5c 而不是
  • LinqToSql 声明和实例化 DataContext 最佳实践?

    设置 DataContext 以便在扩展 LinqToSql 类中轻松访问方面的最佳实践是什么 例如 我的 dbml 中有一个 User 实体 我想向该类添加方法 如下所示 Partial Public Class User Public
  • 在 64 位操作系统上以 32 位运行 IIS 与以 64 位运行 IIS 有何优缺点?

    可能更适合 机架溢出 但从开发人员的角度来看 在 64 位 Windows 主机上将 IIS 同时服务于传统经典 ASP 和 NET 作为 32 位进程而不是 64 位进程运行有哪些优点和缺点 32 64 iis 服务器 相对于 32 32
  • 为什么在 C# 中使用 String.Concat()?

    我想知道这个问题有一段时间了 为什么使用String Concat 而不是使用 操作员 我明白了String Format因为它是一个空洞使用 运算符并使您的代码看起来更好 例如 string one bob string two jim
  • 如何四舍五入到一半,始终为正方向? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何实现以下舍入 0 0126083
  • 如何在 VB.NET 中声明和初始化多维数组?

    我想做这个 Dim Numbers As Integer 1 2 3 4 5 6 7 IDE 的下划线4 5 6 7并说Array initializer has 3 too many elements 我究竟做错了什么 以下应该有效 Di
  • Visual Studio 改变 Ctrl-K-D 的工作方式

    In Visual Studio I m using 2012 is there any way of editing the way that Ctrl K D combinations handles its Auto Formatti
  • 如何在 Windows CE 中使用 VB.Net 访问条码扫描仪

    最近我被要求开发一个应用程序摩托罗拉 MK4000 http www motorola com Business US EN Business Product and Services Micro Kiosks Micro Kiosks M
  • 无法加载 SQL Server Compact 的本机组件

    我已经在 Win7 x64 上安装了 SQL Server Compact Edition 4 0 它可以运行于 Asp Net 和桌面应用程序 此 PC 还安装了 Visual Studio 2010 SP1 但是我的 Server 20
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • asp.net 视图状态加密

    我有几个关于何时以及如何在 ASP NET 3 5 中加密视图状态的问题 例如 如果我的 web config 中有一个机器密钥条目 例如 解密Key 自动生成 IsolateApps 验证 AES 解密 自动 gt 此时视图状态是否已加密

随机推荐

  • 动态绘图在 IDLE 中有效,但在 Jupyter Notebook 中无效

    下面的代码在空闲状态下运行时工作正常 Python 3 6 空闲状态 import matplotlib pyplot as plt import time import random matplotlib inline ysample r
  • 让柱形图在图表控件中重叠

    我有以下问题 我需要在图表控件中显示多个列 一个图表区域中大约有七个系列 现在 当我有一个 列 类型的图表时 所有七列都会并排显示 我想做的就是将它们重叠 这可能吗 以下两个解决方案对我没有帮助 绘制重叠柱形图或条形图 图表控制两个数据集条
  • 当前无法从软件更新服务器获取 Xcode

    更新到 OS X 10 9 后 我的 macport 出现问题 我尝试遵循本手册https trac macports org wiki Migration修复它们 但是当我安装命令行工具时 xcode 选择 安装 我收到消息 无法安装该软
  • Keras 卷积层维数不匹配

    我正在尝试使用 Keras 来构建我的第一个神经网络 我的经验为零 我似乎无法弄清楚为什么我的维度不正确 我无法从他们的文档中弄清楚这个错误在抱怨什么 甚至是哪个层导致了它 我的模型接受 32 字节的数字数组 并应该在另一侧给出一个布尔值
  • 如何防止实体框架在 SQL Server 中生成低效查询?

    我在 EF 4 0 中定义了一个基于视图的实体 该视图位于一个包含大约 1800 万行数据的表上 我选择了实体的 4 个确定性属性作为该实体的复合实体键 我已通过 OData WCF 数据服务公开了对包含此视图的模型的访问 WCF 数据服务
  • 全屏视频视图未居中

    我使用此 XML 布局在我的活动中显示全屏 VideoView 视频是全屏的 但不居中 在横向模式下 它停留在屏幕左侧 并在屏幕右侧留下一些空白 如何使我的 VideoView 放置在屏幕中央
  • 查找 data.frame 中每列的频率

    我有一个如下的数据框 我想找到每列的频率 数据框 No Location Age Size Gender 1 Trinidad 25 3 1 2 Asin 33 2 2 3 Trinidad 33 5 2 4 Trinidad 23 3 1
  • “ascii”编解码器无法解码字节(使用 django 时出现问题)

    我用 python 编写了一个简单的 html 解析类 它似乎工作正常 然后我尝试将它与 django 一起使用 但出现此错误 ascii codec can t decode byte 0xc2 in position 54465 ord
  • 无法让 jQuery Ajax 解析 JSON Web 服务结果

    我已经验证了我的 C Webmethod 的 JSON 响应 所以我不认为这是问题所在 我尝试使用简单的 jQuery ajax 解析结果 但无论出于何种原因 我无法获得正确触发和解析结果的方法 顺便说一句 似乎也无法获得触发结果的函数 它
  • Java JComboBox 监听更改选择事件[重复]

    这个问题在这里已经有答案了 我正在尝试监听 Java JComboBox 中的选择更改 我尝试使用 ActionListener 但问题是这样的 动作侦听器执行类似的操作 public void actionPerformed Action
  • 文本列上的 SQL INNER JOIN

    我有两个表 设备和软件 我想要做一个INNER JOIN在 他们都有一个名为 EQCN 的字段 它是一个文本字段 我收到以下错误 数据类型 text 和 text 在等于运算符中不兼容 必须有办法解决这个问题 将这些列的数据类型更改为var
  • 滚动时间窗口上的 pandas `value_counts`

    我有一个包含字符串值和日期时间索引的 pandas 数据框 如下所示 from datetime import datetime as dt import pandas as pd df pd DataFrame a b b c b b b
  • 共享控制以维护 One-Drive 上的 Access 数据库

    我们有一个中央 Access 数据库 附有较小的外围数据库 我们希望不在同一地点的多个用户可以通过网络使用该数据库 目前我们的数据库位于 OneDrive 上 我们还想在编辑数据库时锁定数据库 我看到 StackOverflow 上有一篇
  • 如何在 firebase 托管 (node.js) 中返回 204 响应代码

    需要一些帮助 我正在尝试使用 android 应用程序访问 firebase 托管上的文件 该应用程序正在下载 txt 文件 并且出于验证原因 在开始下载之前 它应该检查服务器是否可访问 它需要 204 响应代码 没有内容 我可以在 PHP
  • “报告为空” - 是错误吗?

    我已经在 iReport 中创建了带有 3 个参数的报告 并且它运行成功 该报告是使用 3 个参数执行 MS SQL 存储过程 开始日期 enddate dept nm 部门名称 iReport 给出了很好的结果 当我将 jrxml 文件导
  • 全屏iframe高度为100%

    所有浏览器都支持 iframe height 100 吗 我使用 doctype 作为 在我的 iframe 代码中 如果我说 我的意思是它实际上会占据剩余页面的高度 因为顶部有另一个框架 其固定高度为 50px 所有主要浏览器 IE Fi
  • ADFS 2.0 无效名称 ID 策略

    我已经在 adfs 信赖方信任上配置了一个应用程序 因此我可以使用 adfs sso 登录 之后 我安装了 simplesamlphp 来处理该登录 并处理响应 saml 这是我的 authsources 配置 myauth gt arra
  • 关于 iPhone 的方向

    如何获取iPhone当前的方向 我浏览了这个网站 发现了以下两种方法 UIApplication共享应用程序 statusBarOrientation UIDevice currentDevice 方向 哪一种是获取当前方向的正确方法 我在
  • constexpr 使用静态函数初始化静态成员

    要求 我想要一个constexpr值 即编译时常量 计算自constexpr功能 我希望这两个范围都限定在类的命名空间内 即类的静态方法和静态成员 第一次尝试 我首先以 对我来说 显而易见的方式写下这个 class C1 constexpr
  • 有没有办法以编程方式确定字体文件是否具有特定的 Unicode 字形?

    我正在开发一个生成 PDF 的项目 其中可以包含相当复杂的数学和科学公式 文本以 Times New Roman 格式呈现 它具有相当不错的 Unicode 覆盖率 但并不完整 我们有一个系统可以用更完整的 Unicode 字体来替换 TN