ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Iosevka 28.1.0 版本解析:Unicode 16 提案字符、西里尔文本地化形式修复与 `zero` 特性增强

Iosevka 28.1.0 版本解析:Unicode 16 提案字符、西里尔文本地化形式修复与 `zero` 特性增强 Iosevka 28.1.0 版本解析Unicode 16 提案字符、西里尔文本地化形式修复与zero特性增强【免费下载链接】IosevkaVersatile typeface for code, from code.项目地址: https://gitcode.com/GitHub_Trending/io/IosevkaIosevka 28.1.0 是该开源字体项目在 28.x 系列中的一次增量发布核心工作是三件事批量补齐一批与扫描线、方块几何、旧式计算符号相关的字符含提前落地 Unicode 16 提案中的 1CD00–1CE50 区块字形、修复西里尔文塞尔维亚/马其顿/波斯尼亚本地化形式的字形与度量、以及让zeroOpenType 特性对复合字形也生效。本文以 changes/archives/28.x/28.1.0.md 的变更清单为主线结合 packages/font-glyphs 与 packages/font-otl 中的源码实现逐条讲解这些改动的技术细节、适用场景与验证方式帮助读者在升级字体时理解新增字形的能力边界和本地化行为的正确用法。新增字符总览28.1.0 一次新增了四大类字符覆盖三个 Unicode 区块与若干分散码点类别码点范围字符示例用途扫描线系列U23B8 – U23BDLEFT VERTICAL BOX LINE、HORIZONTAL SCAN LINE-1 … SCAN LINE-9旧式终端/字形显示中的扫描线绘制方块几何U26F6、U29C9、U2BBA – U2BBCSQUARE FOUR CORNERS、TWO JOINED SQUARES、OVERLAPPING (WHITE/BLACK) SQUARES几何图形、块状示意图轮廓字母与数字U1CCD6 – U1CCEF、U1CCF0 – U1CCF9OUTLINED LATIN CAPITAL LETTER A … Z、OUTLINED DIGIT ZERO … NINE空心/描边风格的大写字母与数字块八分体与铅字部件U1CD00 – U1CDE5、U1CE0D – U1CE50BLOCK OCTANT-3 … BLOCK OCTANT-2345678、LEFT HALF TRIPLE DASH HORIZONTAL … LARGE TYPE PIECE STEM-12点阵/块图形与旧式排版铅字符号其中后三类U1CCD6 起来自Symbols for Legacy Computing Supplement区块属于 Unicode 16 提案L2/21-235中的内容。这意味着 28.1.0 在 Unicode 标准正式定稿前就提前为这些码点提供了字形为需要渲染旧式计算符号、终端仿真界面或复古排版场景的用户提供了即用能力。扫描线系列与方块几何的源码实现扫描线 U23B8 – U23BD扫描线字符的绘制集中在 packages/font-glyphs/src/symbol/mosaic/box-drawing.ptl实现方式非常直观项目在Symbol-Mosaic-Box-Drawing模块中定义了hline水平线与vline垂直线两个字形生成函数再按归一化位置批量创建字形define [hline unicode pos] : begin create-glyph [MangleName : NameUni unicode] [MangleUnicode unicode] : glyph-proc set-width MosaicWidth include : ForceUpright local posy : mix (bottom light / 2) (top - light / 2) pos include : HBar.m left right posy light define [vline unicode pos] : begin create-glyph [MangleName : NameUni unicode] [MangleUnicode unicode] : glyph-proc set-width MosaicWidth include : ForceUpright local posx : mix (left [HSwToV light] / 2) (right - [HSwToV light] / 2) pos include : VBar.m posx bottom top light # Scan Lines vline 0x23B8 0 vline 0x23B9 1 hline 0x23BA 1 hline 0x23BB (3 / 4) hline 0x23BC (1 / 4) hline 0x23BD 0从源码结构可以看出U23B8/U23B9 是垂直方向的扫描线位置参数分别为 0 和 1即左右两端U23BA–U23BD 是水平方向的扫描线按 1、3/4、1/4、0 的位置落在字形框内不同高度恰好对应传统终端中扫描线自上而下分布的视觉效果。线条粗细取自light AdviceStroke 3.5保证与整套字体的笔画重量一致。方块几何 U26F6、U29C9、U2BBA – U2BBCU26F6 SQUARE FOUR CORNERS 定义在 packages/font-glyphs/src/symbol/geometric/square-corners.ptl模块名为squareCorners取四个角标记的几何构图U29C9、U2BBA–U2BBC 四个重叠方块系列由 packages/font-glyphs/src/symbol/geometric/plain.ptl 中的SquareOverlap函数按参数批量生成SquareOverlap revOverlapWWSquare 0x29C9 1 0 0 SquareOverlap overlapWWSquare 0x2BBA 0 0 0 SquareOverlap overlapBBSquare 0x2BBC 0 1 1其中参数控制两个方块是否填充为白色W或黑色B从而得到白白白黑黑黑三种重叠组合正好对应 TWO JOINED SQUARES 与三个 OVERLAPPING SQUARES 字符的语义差异。Unicode 16 提案字符轮廓字母、数字与块八分体这一批字符全部属于 Symbols for Legacy Computing Supplement旧式计算符号补充区块的 Unicode 16 提案L2/21-235Iosevka 28.1.0 提前实现覆盖 U1CCD6–U1CCEF、U1CCF0–U1CCF9、U1CD00–U1CDE5、U1CE0D–U1CE50 共四个连续段。轮廓字母与数字U1CCD6–U1CCEF、U1CCF0–U1CCF9空心outlined风格的大写字母与数字并非重新绘制而是从现有字形通过描边转换派生而来。核心逻辑在 packages/font-glyphs/src/auto-build/transformed.ptl# Outlined letters and digits -- for Symbols for Legacy Computing Supplement define [TfOutline para forkedPara] : glyph-proc local g currentGlyph.geometry local sw : forkedPara.stroke / 4 local gizmo : currentGlyph.gizmo || GlobalTransform set currentGlyph.geometry : new StrokeGeometry g gizmo sw HVContrast true CreateMathDerivatives legacyComputingOutlined ForkTfm.Bold null 0x1CCD6 UpperLatin null TfOutline CreateMathDerivatives legacyComputingOutlined ForkTfm.Bold null 0x1CCF0 Digits null TfOutline可以看到TfOutline将原字形的几何轮廓重新解释为一条细笔画sw stroke / 4从而把实心字形变成描边轮廓字形并通过CreateMathDerivatives以legacyComputingOutlined为名批量派生 U1CCD6 起的大写拉丁字母与 U1CCF0 起的数字。这种派生而非手绘的做法保证了轮廓字母与正文字母在字重、衬线和比例上严格一致。块八分体与铅字部件U1CD00–U1CDE5、U1CE0D–U1CE50块八分体BLOCK OCTANT属于点阵/块状图形体系实现上复用已有栅格生成逻辑。例如 packages/font-glyphs/src/symbol/mosaic/teletext.ptl 中通过BlockMosaic24 0x1CD00 3之类调用生成对应码点的字形与项目既有的 mosaic马赛克字形体系共用同一套网格工具。拆分虚线如 U1CE0D LEFT HALF TRIPLE DASH HORIZONTAL则定义在 packages/font-glyphs/src/symbol/mosaic/box-drawing.ptl 的 Split Dashed Lines 小节用两段HBar.m拼出中间断开的水平线# Split Dashed Lines create-glyph [MangleName : NameUni 0x1CE0D] [MangleUnicode 0x1CE0D] : glyph-proc set-width MosaicWidth include : ForceUpright include : HBar.m left [mix left right (1 / 3)] midy light include : HBar.m [mix left right (2 / 3)] right midy light其余铅字部件LARGE TYPE PIECE STEM-* 等延续了该区块以基础条块组合出部件符号的构图思路。需要提醒的是由于这些码点来自提案而非正式标准仅有支持对应 Unicode 版本的渲染环境才能正确显示在旧版软件中可能显示为空白或 .notdef使用时需结合自身平台评估。西里尔文本地化形式修复与新增28.1.0 对西里尔文做了三处改动全部围绕本地化字形localized forms展开这是 Iosevka 支持多语言排版正确性的关键部分。Yery 度量修复#2182Ы/ыYery是西里尔文中最容易出度量问题的字符之一——它由Ь加竖笔组合而成竖笔的 x 位置、衬线serif尺寸稍有偏差就会显得失衡。Yery 的字形逻辑位于 packages/font-glyphs/src/letter/cyrillic/yery.ptl其中CyrYeryShape通过df.leftSB、df.rightSB、advanceScaleM/MM等度量参数计算xMiddle并以piecewise条件挂接serifRT、serifRB衬线。本次修复#2182调整的即是这套度量计算使正体下 Yery 的竖笔位置与整体字面保持一致。塞尔维亚/马其顿/波斯尼亚本地化形式塞尔维亚SRB与马其顿MKD西里尔文在斜体下习惯将部分字母如 б、г、д、п、т改写为接近手写/拉丁风格的形态。本次除了修复这两个语言已有的 Italic/Upright 本地化形式还新增了基于塞尔维亚/马其顿的波斯尼亚BOS西里尔文本地化形式。底层实现位于 packages/font-otl/src/gsub-locl.ptl 的buildLOCL函数。可以看到三种语言共享同一个loclfeature 与查找表define cyrlSRB : gsub.copyLanguage cyrl_SRB cyrl_DFLT define cyrlMKD : gsub.copyLanguage cyrl_MKD cyrl_DFLT define cyrlBOS : gsub.copyLanguage cyrl_BOS cyrl_DFLT # SRB define loclSRB : gsub.createFeature locl cyrlSRB.addFeature loclSRB cyrlMKD.addFeature loclSRB cyrlBOS.addFeature loclSRB loclSRB.addLookup : createGsubLookupFromGr gsub glyphStore if [not para.isItalic] LocalizedForm.SRB.Upright LocalizedForm.SRB.Italic其中if [not para.isItalic]一行是关键字体会同时内嵌正体与斜体两套本地化替换规则正体使用LocalizedForm.SRB.Upright斜体则走LocalizedForm.SRB.Italic——这正是本次修复 Italic/Upright 本地化形式的落点。因此只要文本标记为sr、mk或bs语言并配合locl特性多数排版引擎默认启用即可自动得到对应语言的本地化字形。Combining Cyrillic Letter Es-TeU2DF5斜体形式#2187U2DF5COMBINING CYRILLIC LETTER ES-TE是西里尔音标转写用的组合字符本次为它补上了斜体变体。其字形绑定定义在 packages/font-glyphs/src/auto-build/transformed-jobs-data.ptllist 0x2DF5 cyrl/este即码点 U2DF5 映射到cyrl/este字形家族斜体构建时随整套西里尔字母一起倾斜生成保证组合字符在斜体文本中与基字风格统一。zero特性现在也作用于复合字形#2191在 28.1.0 之前zeroOpenType 特性用于切换斜杠零/无斜杠零通常映射到 ss01 或 cv 系列特性只作用于单个零字形而由零参与构成的复合字形如上下标零、带圈数字中的零等不会被替换导致同一段落里出现有些零带斜杠、有些不带的不一致。本次修复后zero特性会通过字形关系系统一并替换复合字形中的零部件。关键改动在 packages/font-glyphs/src/number/0.ptl 中对衬线数字与老式数字两套变体分别注册select-variant zero.lnum [CodeLnum 0] (follow -- zero) select-variant zero.onum [CodeOnum 0] (follow -- zero) select-variant zero.lnum/forceSlashed (follow -- zero/forceSlashed) (shapeFrom -- zero.lnum) select-variant zero.onum/forceSlashed (follow -- zero/forceSlashed) (shapeFrom -- zero.onum) select-variant zero.lnum/forceUnslashed (follow -- zero/forceUnslashed) (shapeFrom -- zero.lnum) select-variant zero.onum/forceUnslashed (follow -- zero/forceUnslashed) (shapeFrom -- zero.onum) if [query-glyph zero.lnum] : Zero.set [query-glyph zero.lnum] zero.lnum/forceSlashed if [query-glyph zero.onum] : Zero.set [query-glyph zero.onum] zero.onum/forceSlashed其中Zero.set把斜杠零注册为可沿字形复合关系传播的替换目标shapeFrom保证forceSlashed/forceUnslashed派生形态与基础零共享几何。复合字形如zero.lnum参与组合的上标/带圈形态在构建时查询该注册关系从而让斜杠零风格在整段文本中保持一致。如果你通过 params/variants.toml 配置过zero变体如cv01或ss01在升级到 28.1.0 后无需更改配置即可让复合字形享受同一规则。如何构建与验证以上改动随 28.1.0 版本发布可通过两种方式使用直接下载发布包使用仓库 README.md 中列出的各平台预编译字体文件本地构建项目根目录的 package.json 定义了构建脚本构建参数见 params/parameters.toml字重、宽度、坡度与 params/variants.toml字符变体例如启用斜杠零可配置zero变体后执行构建命令产物位于dist目录。验证时建议关注三处行为Unicode 16 提案字符用支持最新 Unicode 的文本编辑器或终端渲染 U1CCD6、U1CD00、U1CE0D 等码点确认轮廓字母与块八分体显示正常本地化形式将文本语言标记为sr塞尔维亚或bs波斯尼亚在斜体与正体下分别检查 б/г/д/п/т 的形态切换斜杠零一致性开启zero特性后在同一段文本中混用普通零与带圈/上标零确认所有零的斜杠风格一致。小结Iosevka 28.1.0 的改动体现出该项目字形覆盖先行、本地化精确化、特性规则系统化的演进路线Unicode 16 提案字符的提前落地拓宽了旧式计算符号的覆盖西里尔文 SRB/MKD/BOS 本地化形式与 Es-Te 斜体的修复补齐了多语言排版细节zero特性对复合字形的支持则消除了特性开关带来的视觉不一致。对于终端仿真、复古计算展示和斯拉夫语系排版用户这是一次值得升级的增量发布。【免费下载链接】IosevkaVersatile typeface for code, from code.项目地址: https://gitcode.com/GitHub_Trending/io/Iosevka创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表