首页 > 其他分享 >检测字体文件中不支持哪些字符字形;传入一段文字内容,返回字体包不支持的字符

检测字体文件中不支持哪些字符字形;传入一段文字内容,返回字体包不支持的字符

时间:2024-10-12 11:00:38浏览次数:9  
标签:包不 字符 const text fontPath 字体 unsupportedChars glyph

const package = require('../package');
const fs = require('fs');
const opentype = require('opentype.js');

function findUnsupportedChars(fontPath, text) {
    const font = opentype.loadSync(fontPath);
    const unsupportedChars = [];

    for (let i = 0; i < text.length; i++) {
        let char = text[i];
        // 处理多字节字符(如emoji)
        if (char.codePointAt(0) > 0xFFFF) {
            char = text.slice(i, i + 2); // 假设是四字节字符,取两个JavaScript字符
            i++; // 跳过下一个字符,因为它已经是当前字符的一部分了
        }
        const glyphs = font.stringToGlyphs(char);

        // 检查是否找到了对应的glyph,并且该glyph有有效的Unicode属性
        let isSupported = false;
        for (const glyph of glyphs) {
            if (glyph.unicode !== undefined || glyph.unicodes.length > 0) {
                isSupported = true;
                break;
            }
        }

        // 如果没有找到支持的glyph
        if (!isSupported) {
            unsupportedChars.push(char);
        }
    }

    return unsupportedChars;
}

// const fontPath = '/usr/share/fonts/yimeng3-fonts/碳纤维正大黑简体.ttf';
// const text = '蕸紦的一堂缔约良缘永结匹配同称十指相扣终于白首王小姐';

// 从命令行参数获取字体文件路径和文本
const [nodePath, scriptPath, fontPath, ...textArgs] = process.argv;
const text = textArgs.join(' '); // 将所有文本参数连接成一个字符串

// 验证命令行参数
if (!fontPath || text.length === 0) {
    console.error('Usage: node script.js <fontPath> <text>');
    process.exit(1);
}

const unsupportedChars = findUnsupportedChars(fontPath, text);
console.log(JSON.stringify(unsupportedChars));

 

执行示例:fontparseNew 碳纤维正大黑简体.ttf "蕸紦的一堂缔约良缘永结匹配同称十指相扣终于白首王小姐"

命令行执行返回结果:["蕸","紦"]

 

标签:包不,字符,const,text,fontPath,字体,unsupportedChars,glyph
From: https://www.cnblogs.com/anniu1122/p/18460098

相关文章

  • 【C语言】语义陷阱(5):揭秘空指针与空字符串的微妙差异
    目录一、空指针(NullPointer)1.1.定义与表示1.2.用途1.3.安全性 1.4.注意事项1.5.空指针与野指针的区别1.5.1.特性对比1.5.2.安全性与风险1.5.3.编程实践二、指向空字符串的指针2.1.定义2.2.字符数组与空字符串2.3.指针的初始化2.4.空字符串的用途2......
  • 问题定位总结:java空字符
    在线上业务中,有个校验,校验用户输入的信息与现在表里存的信息数据是否一致。比较时忽略首尾的空字符。但收到用户反馈,在页面填入的数据和表里存的数据一致。校验却不通过。假设表里存的是“CSDN专业开发者社区”,用户填写的是“CSDN专业开发者社区   ”,后面带有空格。对于用......
  • 为什么5个字符至少需要3位二进制数表示?
    目录1.二进制编码基础2.5个字符的二进制表示3.编码理论的应用4.数据压缩与二进制编码5.软件工程中的编码实践6.结论        在软件工程和计算机科学的许多领域,有效的数据表示是一项基础且关键的任务。二进制编码是其中一种核心方法,它影响着数据存储、传......
  • 20241011-1 字符串函数自写
    #include<stdio.h>#include<string.h>unsignedintmystrlen(char*str){ unsignedintcount=0; while('\0'!=*(str++)) { count++; } returncount;}/*str1:目的字符串str2:源字符串*/voidmystrcpy(char*str1,char*str2){ ch......
  • 获取字符串的在html页面上的宽度并且若文字过长则缩小字体填充
    某个页面有这样一个需求:一个固定宽度的div,若文字过长,则缩小字体填充。看到同事采用的是用php的GD库的imagettfbbox函数来计算文字的宽度。imagettfbbox(float $size,float $angle,string $font_filename,string $string,array $options=[]): array|false 取得使用Tru......
  • resultmap返回字符串set集合
    在resultmap中写好数组实体层的set集合(不用list是因为要去重,要用list的话把set改为list,再下面的sql查询把DISTINCT去掉就可)这里的selectCategoryNumber对应图一中的selectCategoryNumberwhere语句中的recods_id对应图一的column的recods_id最后只要再定义的resultmap......
  • C++删除字符串中的所有空格与换行(任意字符)
    删除字符串中的所有空格与换行使用头文件中的remove函数,注意:std::remove不会改变容器的大小,它只是将元素移动到容器的末尾。因此,我们需要调用erase来实际从字符串中删除这些元素。使用std::remove算法,它重排元素,使得要删除的元素(在这里是空格和换行符)被放在序列的末尾,......
  • Leetcode 839. 相似字符串组【附并查集模板】
    1.题目基本信息1.1.题目描述如果交换字符串X中的两个不同位置的字母,使得它和字符串Y相等,那么称X和Y两个字符串相似。如果这两个字符串本身是相等的,那它们也是相似的。例如,”tars”和“rats”是相似的(交换0与2的位置);“rats”和“arts”也是相似的,但是“s......
  • 多层嵌套json字符串(jsonStr)写入redis
    1、连接redisJedisjedis=newJedis("localhost",6379);2、将字符串转为json格式JSONObjectjs=JSONObject.fromObject(jsonStr);3、对json格式进行解析4、将json写入redispublicstaticvoidRedisSet(JSONObjectjs,Jedisjs01){//获取json中的所有key......
  • 洛谷题单指南-字符串-P2580 于是他错误的点名开始了
    原题链接:https://www.luogu.com.cn/problem/P2580题意解读:给n个字符串,再依次处理m个字符串,对于每个字符串,如果在前面n个字符串中输出OK,如果不在n个字符串中输出WRONG,如果在n个字符串中且不止一次查询过输出REPEAT。解题思路:1、set/map方法很简单直接,用set存下前n个字符串,map......