当前位置: 首页 > article >正文

Mac 平台 字体Unicode范围分析器

字体Unicode范围分析器

#include <CoreText/CoreText.h>       // CoreText框架头文件,用于字体处理
#include <CoreFoundation/CoreFoundation.h> // CoreFoundation框架头文件
#include <stdio.h>                   // 标准输入输出
#include <stdlib.h>                  // 标准库函数
#include <string.h>                  // 字符串处理
#include <vector>                    // C++向量容器
#include <map>                       // C++映射容器
#include <string>                    // C++字符串// 定义Unicode范围结构体,表示一个连续的Unicode字符范围
typedef struct {uint32_t start;  // 范围起始码点uint32_t end;    // 范围结束码点
} UnicodeRange;// 全局映射表,存储字体名称和对应的Unicode范围集合
// key: 字体名称(string)
// value: 该字体支持的Unicode范围集合(vector<UnicodeRange>)
std::map<std::string, std::vector<UnicodeRange>> fontUnicodeRanges;// 函数:获取字体支持的Unicode范围
// 参数:字体引用(CTFontRef)
// 返回值:该字体支持的Unicode范围集合(vector<UnicodeRange>)
std::vector<UnicodeRange> getSupportedUnicodeRanges(CTFontRef font) {std::vector<UnicodeRange> tempRanges; // 临时存储范围集合if (!font) {  // 检查字体引用是否有效return tempRanges; // 无效则返回空集合}// 1. 获取字体支持的字符集CFCharacterSetRef charset = CTFontCopyCharacterSet(font); // 复制字体字符集// 创建字符集的位图表示CFDataRef bitmapData = CFCharacterSetCreateBitmapRepresentation(kCFAllocatorDefault, charset);const UInt8 *bitmap = CFDataGetBytePtr(bitmapData); // 获取位图数据指针CFIndex length = CFDataGetLength(bitmapData);      // 获取位图数据长度bool inRange = false;   // 标记是否处于连续范围内uint32_t start = 0;     // 当前范围的起始码点uint32_t maxChar = 0;   // 当前范围的结束码点// 2. 遍历位图,检测并合并连续范围for (uint32_t byteIndex = 0; byteIndex < length; byteIndex++) {UInt8 byte = bitmap[byteIndex]; // 获取当前字节if (byte == 0) {  // 如果字节为0,表示没有支持的字符if (inRange) { // 如果之前处于范围内,则结束当前范围tempRanges.push_back({start, (byteIndex << 3) - 1});inRange = false;}continue; // 跳过后续处理}// 检查字节中的每一位(共8位)for (uint32_t bit = 0; bit < 8; bit++) {uint32_t currentChar = (byteIndex << 3) + bit; // 计算当前字符码点bool isSupported = (byte & (1 << bit)) != 0;   // 检查当前位是否被支持if (isSupported) {  // 如果字符被支持if (!inRange) { // 如果不在范围内,则开始新范围start = currentChar;inRange = true;}maxChar = currentChar; // 更新范围结束码点} else if (inRange) { // 如果字符不被支持但之前处于范围内tempRanges.push_back({start, currentChar - 1}); // 结束当前范围inRange = false;}}}// 处理最后一个范围(如果遍历结束时仍处于范围内)if (inRange) {tempRanges.push_back({start, maxChar});}// 3. 压缩范围(合并相邻或重叠的范围)if (!tempRanges.empty()) {size_t compressedCount = 0; // 压缩后的范围计数// 遍历所有范围for (size_t i = 1; i < tempRanges.size(); i++) {// 如果当前范围与前一个范围相邻或重叠if (tempRanges[i].start <= tempRanges[compressedCount].end + 1) {// 合并范围(取最大的结束码点)if (tempRanges[i].end > tempRanges[compressedCount].end) {tempRanges[compressedCount].end = tempRanges[i].end;}} else {// 不重叠则保留当前范围compressedCount++;tempRanges[compressedCount] = tempRanges[i];}}// 调整向量大小为压缩后的数量tempRanges.resize(compressedCount + 1);}// 释放资源CFRelease(bitmapData);CFRelease(charset);return tempRanges; // 返回最终的范围集合
}// 函数:获取字体名称
// 参数:字体引用(CTFontRef)
// 返回值:字体名称(string)
std::string getFontName(CTFontRef font) {if (!font) return ""; // 检查字体引用// 获取字体的PostScript名称CFStringRef fontName = CTFontCopyPostScriptName(font);if (!fontName) return ""; // 检查名称是否有效// 尝试直接获取C字符串const char* name = CFStringGetCStringPtr(fontName, kCFStringEncodingUTF8);std::string result;if (name) { // 如果直接获取成功result = name;} else {// 需要手动转换字符串CFIndex length = CFStringGetLength(fontName);CFIndex maxSize = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8) + 1;char* buffer = new char[maxSize]; // 分配缓冲区// 将CFString转换为C字符串if (CFStringGetCString(fontName, buffer, maxSize, kCFStringEncodingUTF8)) {result = buffer;}delete[] buffer; // 释放缓冲区}CFRelease(fontName); // 释放CFStringreturn result;      // 返回转换后的字符串
}// 函数:添加字体到全局映射表
// 参数:字体引用(CTFontRef)
void addFontToMap(CTFontRef font) {std::string fontName = getFontName(font); // 获取字体名称if (!fontName.empty()) { // 如果名称有效// 将字体名称和对应的Unicode范围存入映射表fontUnicodeRanges[fontName] = getSupportedUnicodeRanges(font);}
}// 函数:打印所有字体的Unicode范围
void printAllFontRanges() {// 遍历映射表中的所有字体for (const auto& pair : fontUnicodeRanges) {printf("字体: %s\n", pair.first.c_str()); // 打印字体名称// 打印该字体支持的所有Unicode范围for (const auto& range : pair.second) {printf("  支持范围: U+%04X - U+%04X\n", range.start, range.end);}printf("\n"); // 打印空行分隔不同字体}
}// 主函数
int main() {// 示例:创建并分析三种字体// 1. 创建苹方字体CTFontRef font1 = CTFontCreateWithName(CFSTR("PingFangSC-Regular"), 16.0, nullptr);if (font1) {addFontToMap(font1); // 添加到映射表CFRelease(font1);    // 释放字体}// 2. 创建Helvetica字体CTFontRef font2 = CTFontCreateWithName(CFSTR("Helvetica"), 16.0, nullptr);if (font2) {addFontToMap(font2);CFRelease(font2);}// 3. 创建Times New Roman字体CTFontRef font3 = CTFontCreateWithName(CFSTR("TimesNewRomanPSMT"), 16.0, nullptr);if (font3) {addFontToMap(font3);CFRelease(font3);}// 打印所有已分析字体的Unicode范围printAllFontRanges();return 0;
}

代码中文名称:字体Unicode范围分析器

功能说明:

  1. 核心功能:分析字体文件支持的Unicode字符范围

  2. 数据结构:使用map容器存储字体名称及其支持的Unicode范围

  3. 技术特点:
    • 使用CoreText框架获取字体信息

    • 通过位图分析高效检测字符支持情况

    • 自动合并相邻或重叠的Unicode范围

  4. 输出格式:清晰的字体支持范围列表

适用场景:
• 字体管理工具开发

• 多语言文本处理应用

• 字体兼容性检查

• 文字渲染优化

相关文章:

Mac 平台 字体Unicode范围分析器

字体Unicode范围分析器 #include <CoreText/CoreText.h> // CoreText框架头文件&#xff0c;用于字体处理 #include <CoreFoundation/CoreFoundation.h> // CoreFoundation框架头文件 #include <stdio.h> // 标准输入输出 #include…...

【C++游戏引擎开发】第30篇:物理引擎(Bullet)—软体动力学系统

一、软体动力学理论体系 1.1 连续体力学基础 1.1.1 变形梯度张量 物体运动可描述为映射函数: x = ϕ ( X , t ) \mathbf{x} = \phi(\mathbf{X},t) x...

vue2 结合后端预览pdf 跨域的话就得需要后端来返回 然后前端呈现

<el-button :loading"pdfIslock" v-if"isPDFFile(form.pic)" type"primary" style"margin: 15px 0" click"previewPDF(form.pic)"> 预览pdf </el-button>//npm install pdfjs-dist //如果没有就得先安装import …...

什么是 HSQLDB?

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; Java开发人员学习Java数据库连接&#xff08;JDBC&#xff09;的最简单方法是试验HyperSQL数据库&#xff08;又名HSQLDB&#xff09;。 …...

AI时代企业应用系统架构的新思路与CIO变革指南

作为制造企业CIO&#xff0c;我们看问题需要有前瞻性&#xff0c;AI时代企业应用系统架构需要进行全面转型。 一、新思想与新技术 1. 核心新思想 可视化开发AI的融合模式&#xff1a;不再只依赖纯代码开发或传统低代码&#xff0c;而是两者结合&#xff0c;通过AI理解自然语…...

多语言爬虫实现网站价格监控

最近突发奇想想用多种代码来爬取数据做价格监控。常见的比如Python、JavaScript(Node.js)、或者Go&#xff1f;不过通常来说&#xff0c;Python应该是首选&#xff0c;因为它的库比较丰富&#xff0c;比如requests和BeautifulSoup&#xff0c;或者Scrapy。不过客户要求多种代码…...

如何修改 JAR 包中的源码

如何修改 JAR 包中的源码 前言一、准备工作二、将 JAR 当作 ZIP 打开并提取三、重写 Java 类方法 A&#xff1a;直接替换已编译的 .class方法 B&#xff1a;运行时类路径优先加载 四、修改 MyBatis&#xff08;或其他&#xff09;XML 资源五、重新打包 JAR&#xff08;命令行&a…...

16.Three.js 中的 RectAreaLight 全面详解 + Vue 3 实战案例

&#x1f60e; 本文将带你从零了解 THREE.RectAreaLight 的工作原理、使用方式、注意事项&#xff0c;并在最后用 Vue 3 的 Composition API 封装一个完整的光源演示组件&#xff0c;一站式搞懂矩形区域光的魅力 &#x1f4a1;&#xff01; &#x1f5bc;️ 一、展示图效果示意…...

excel 批量导出图片并指定命名

一、开发环境 打开excel文件中的宏编辑器和JS代码调试 工具-》开发工具-》WPS宏编辑器 左边是工程区&#xff0c;当打开多个excel时会有多个&#xff0c;要注意不要把代码写到其他工作簿去了 右边是代码区 二、编写代码 宏是js语言&#xff0c;因此变量或者方法可以网上搜…...

PyTorch_创建01张量

torch.ones 和 torch.ones_like 创建全1张量torch.zeros 和 torch.zeros_like 创建全0张量torch.full 和 torch.full_like 创建全为指定值张量 上面的函数里有 like 表示根据另外一个张量的形状创建全0或者全1的或者全为指定值的张量。 代码 import torch …...

神经网络之互动练习详解:从基础到拟合非线性数据

神经网络之互动练习详解&#xff1a;从基础到拟合非线性数据 在机器学习的世界里&#xff0c;神经网络是一种强大而神奇的工具&#xff0c;它可以帮助我们解决各种复杂的问题。今天&#xff0c;我们就通过一个有趣的互动练习&#xff0c;来深入了解神经网络的工作原理以及如何…...

Mem0.ai研究团队开发的全新记忆架构系统“Mem0”正式发布

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

海外社交软件技术深潜:实时互动系统与边缘计算的极限优化

一、毫秒级延迟之战&#xff1a;下一代实时通信架构 1.1 全球实时消息投递体系设计 图表 代码 性能基准测试&#xff08;跨大西洋传输&#xff09;&#xff1a; 协议/算法组合 平均延迟 99分位延迟 丢包恢复率 WebSocketTLSBBRv2 142ms 298ms 78% QUIC自定义CC 112ms 201ms 92%…...

通过DeepSeek大语言模型控制panda机械臂,听懂人话,拟人性回答。智能机械臂助手又进一步啦

文章目录 前言环境配置运行测试报错 前言 通过使用智能化的工作流控制系统来精确操控机械臂&#xff0c;不仅能够基于预设算法可靠地规划每个动作步骤的执行顺序和力度&#xff0c;确保作业流程的标准化和可重复性&#xff0c;还能通过模块化的程序设计思路灵活地在原有工作流中…...

如何添加或删除极狐GitLab 项目成员?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目成员 (BASIC ALL) 成员是有权访问您的项目的用户和群组。 每个成员都有一个角色&#xff0c;这决定了他们在项目中可以…...

计算机网络-LDP标签发布与管理

前面学习了LDP建立邻居&#xff0c;建立会话&#xff0c;今天来学习在MPLS中的标签发布与管理。 在MPLS网络中&#xff0c;下游LSR决定标签和FEC的绑定关系&#xff0c;并将这种绑定关系发布给上游LSR。LDP通过发送标签请求和标签映射消息&#xff0c;在LDP对等体之间通告FEC和…...

云境天合水陆安全漏电监测仪—迅速确定是否存在漏电现象

云境天合水陆安全漏电监测仪是一种专为水下及潮湿环境设计的电气安全检测设备&#xff0c;通过高灵敏度电磁传感器探测漏电电流产生的交变磁场&#xff0c;基于法拉第电磁感应定律&#xff0c;自动区分高灵敏度信号和低灵敏度信号&#xff0c;精准定位泄漏电源的具体位置。一旦…...

软考 系统架构设计师系列知识点之杂项集萃(54)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;53&#xff09; 第87题 某银行系统采用Factory Method方法描述其不同账户之间的关系&#xff0c;设计出的类图如下所示。其中与Factory Method的“Creator”角色对应的类是&#xff08;&#xff…...

Nginx +Nginx-http-flv-module 推流拉流

这两天为了利用云服务器实现 Nginx 进行OBS Rtmp推流&#xff0c;Flv拉流时发生了诸多情况&#xff0c;记录实现过程。 环境 OS&#xff1a;阿里云CentOS 7.9 64位Nginx&#xff1a;nginx-1.28.0Nginx-http-flv-module&#xff1a;nginx-http-flv-module-1.2.12 安装Nginx编…...

KeyPresser 一款自动化按键工具

1. 简介 KeyPresser 是一款自动化按键工具,它可以与窗口交互,并支持后台运行, 无需保持被控窗口在前台运行。用户可以选择要操作的目标窗口,并通过勾选复选框来控制要发送哪些按键消息。可以从组合框中选择所需的按键,并在编辑框中输入时间间隔以控制按键发送之间的延迟。程…...

DVWA靶场保姆级通关教程--03CSRF跨站请求伪造

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、low级别的源码分析 二、medium级别源码分析 安全性分析 增加了一层 Referer 验证&#xff1a; 关键点是&#xff1a;在真实的网络环境中&a…...

从 Python 基础到 Django 实战 —— 数据类型驱动的 Web 开发之旅

主题简介&#xff1a; 本主题以 Python 基础数据类型为核心&#xff0c;结合 Django 框架的开发流程&#xff0c;系统讲解如何通过掌握数字、字符串、列表、元组、字典等基础类型&#xff0c;快速构建功能完善的 Web 应用。通过理论与实践结合&#xff0c;帮助学员从零基础 Py…...

架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案

文章目录 引言一、升级读服务架构&#xff0c;为什么需要自动化测试&#xff1f;二、自动化回归测试系统&#xff1a;整体架构概览三、日志收集1. 拦截方式2. 存储与优化策略3. 架构进化 四、数据回放技术实现关键能力 五、差异对比对比方式灵活配置 六、三种回放模式详解1. 离…...

Qt实现车载多媒体项目,包含天气、音乐、视频、地图、五子棋功能模块,免费下载源文件!

本文主要介绍项目&#xff0c;项目的结构&#xff0c;项目如何配置&#xff0c;项目如何打包。这篇文章如果对你有帮助请点赞和收藏&#xff0c;谢谢&#xff01;源代码仅供学习使用&#xff0c;如果转载文章请标明出处&#xff01;&#xff08;免费下载源代码&#xff09;&…...

Ubuntu 安装 Nginx

Nginx 是一个高性能的 Web 服务器和反向代理服务器&#xff0c;同时也可以用作负载均衡器和 HTTP 缓存。 Nginx 的主要用途 用途说明Web服务器提供网页服务&#xff0c;处理用户的 HTTP 请求&#xff0c;返回 HTML、CSS、JS、图片等静态资源。反向代理服务器将用户请求转发到…...

Android数据库全栈开发实战:Room+SQLCipher+Hilt企业级应用构建

简介 在移动应用开发中,数据库作为数据存储的核心组件,其安全性和性能对企业级应用至关重要。本文将从零开始,全面讲解Android数据库开发的最新技术,包括Room框架的深度使用、SQLCipher加密数据库的实现、Hilt依赖注入的集成以及前后端数据同步的完整方案。通过一个加密任…...

【PostgreSQL】超简单的主从节点部署

1. 启动数据库 启动主节点 docker run --name postgres-master -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres启动从节点 docker run --name postgres-slave -e POSTGRES_PASSWORDmysecretpassword -p 5432:5432 -d postgres需要配置挂载的存储卷 2. 数据…...

zotero pdf中英翻译插件使用

最近发现一个pdf中英翻译的神器zotero-pdf2zh&#xff0c;按照官方安装教程走一遍的时候&#xff0c;发现一些流程不清楚的问题&#xff0c; 此文就是整理一些安装需要的文件以及遇到的问题&#xff1a; 相关文件下载地址 Zotero 是一款免费的、开源的文献管理工具&#xff0…...

WSL(Windows Subsystem for Linux)入门

目录 1.简介2.安装与配置3.常用命令4.进阶使用4.1 文件系统交互4.2 网络互通4.3 配置代理4.4 运行 GUI 程序4.5 Docker 集成 1.简介 WSL 是 Windows 系统内置的 Linux 兼容层&#xff0c;允许直接在 Windows 中运行 Linux 命令行工具和应用程序&#xff0c;无需虚拟机或双系统…...

Python项目73:自动化文件备份系统1.0(tkinter)

主要功能说明&#xff1a; 1.界面组件&#xff1a;源文件夹和目标文件夹选择&#xff08;带浏览按钮&#xff09;&#xff0c;备份间隔时间设置&#xff08;分钟&#xff09;&#xff0c;立即备份按钮&#xff0c;自动备份切换按钮&#xff0c;状态栏显示备份状态。 2.进度条显…...