双向文本处理实战:RTLTMPro之LigatureFixer文本流反转与LTR片段保留算法

发布时间:2026/8/24 18:00:56
双向文本处理实战:RTLTMPro之LigatureFixer文本流反转与LTR片段保留算法 双向文本处理实战RTLTMPro之LigatureFixer文本流反转与LTR片段保留算法【免费下载链接】RTLTMProRight-To-Left Text Mesh Pro for Unity. This plugin adds support for Persian and Arabic languages to TextMeshPro.项目地址: https://gitcode.com/gh_mirrors/rt/RTLTMProRTLTMPro 是一款为 Unity TextMeshPro 提供波斯语、阿拉伯语和希伯来语支持的开源插件。它的核心组件LigatureFixer解决了一个关键问题如何把从右到左RTL书写的文本流正确反转同时保留其中的英文单词、数字和富文本标签的原始顺序LTR 片段保留。本文将带你用通俗的方式读懂这套双向文本Bidirectional Text处理算法。为什么 RTL 文本需要专门处理波斯语、阿拉伯语等语言从右向左书写而计算机内部文本都是按从左到右的顺序存储的。如果把一段 RTL 文本直接丢给 TextMeshPro字母顺序就是乱的——就像把一句波斯语逐词倒着读。Unity 引擎本身没有内置的双向文本算法所以 RTLTMPro 在文本提交给渲染组件之前先做一遍文本修复。整个过程无需手动转换、复制或粘贴你写什么显示的就是什么。RTLTMPro 的四步文本处理流水线在RTLSupport.cs路径Assets/RTLTMPro/Scripts/Runtime/RTLSupport.cs的FixRTL方法中一条文本要依次经过四个修正器步骤模块职责1TashkeelFixer先摘除阿拉伯语元音符号Tashkeel避免干扰字形判断2GlyphFixer把字母改成正确的连写形状首形/中形/末形/独立形3LigatureFixer反转文本流同时保留 LTR 片段本文主角4RichTextFixer最后还原富文本标签的左右方向所有中间结果都在FastStringBuilder路径Assets/RTLTMPro/Scripts/Runtime/FastStringBuilder.cs中传递——一个按 UTF-32 码点存储的高性能缓冲区天然支持 emoji 等超出 BMP 的字符。文本流反转从末尾向前遍历的核心技巧LigatureFixer.Fix路径Assets/RTLTMPro/Scripts/Runtime/LigatureFixer.cs的算法骨架非常简单从最后一个字符向前遍历输入文本for i Length - 1 → 0。遇到普通 RTL 字母先清空暂存缓冲区再把这个字符直接写入输出——顺序自然就反过来了。遇到不能反转的字符英文、数字等不直接写输出而是丢进一个叫LtrTextHolder的暂存缓冲区。当缓冲区里攒够了一个完整 LTR 片段遇到 RTL 字母时才释放用FlushBufferToOutput一次性倒序倒出——保证片段内部字符顺序不变。一句话总结RTL 字符随到随写LTR 字符攒够一坨再倒序倒出这就是文本流反转 片段保留的全部秘密。LTR 片段保留英文、数字与标签如何保持原序算法通过Char32Utils路径Assets/RTLTMPro/Scripts/Runtime/Char32Utils.cs判断每个字符的身份以下情况会进入 LTR 保留逻辑英文字母与数字直接进缓冲区保持原序。数字还区分farsi模式和preserveNumbers开关对应波斯数字、阿拉伯数字或保留英文数字。富文本标签遇到时向前扫描配对的验证是合法标签标签内不能以空格开头把整个tag当作 LTR 片段保护起来避免被反转成gac。混合文本中的空格如果空格两侧都是英文、数字或符号例如Apple 12345中间的换行空格这个空格也计入 LTR 缓冲区防止单词被拆开错位。Surrogate 对0xD800–0xDFFF区间的代理对emoji 等成对保留防止被拆坏。标点镜像与细节打磨RTL 排版中标点必须跟着邻居走括号镜像( )与« »这类方向性符号只要相邻字符是 RTL 字母就会自动替换成镜像形态如(变)括号开口方向才符合阅读习惯。标点归属判断句点.、阿拉伯逗号،、分号؛等根据前后是 RTL 字母、空白还是下划线决定是就地写出还是跟片段进缓冲区避免出现标点跑到句子另一端的怪现象。零宽不连字ZWNJ被识别后静默丢弃字形阶段已处理不影响输出。实际渲染效果标签与多行文本标签保护算法的效果——富文本中的颜色、字号标签在反转后依然完整生效RTL 文字与 LTR 标签共存不乱序RTLTMPro 富文本标签保留与 RTL 文本流反转渲染效果多行 RTL 文本同样被正确处理长段落逐行从右向左排布阅读源码与测试用例的入口想动手验证从这些文件开始路径均相对仓库根目录算法主体Assets/RTLTMPro/Scripts/Runtime/LigatureFixer.cs流水线调度Assets/RTLTMPro/Scripts/Runtime/RTLSupport.cs组件入口Assets/RTLTMPro/Scripts/Runtime/RTLTextMeshPro.cstext属性被重写后触发整条流水线单元测试Assets/RTLTMPro/Tests/RTLSupportTests.cs、Assets/RTLTMPro/Tests/GlyphFixerTests.cs运行时程序集定义Assets/RTLTMPro/Scripts/Runtime/RTLTMPro.asmdef小结RTLTMPro 的LigatureFixer用最朴素的手段解决了双向文本中最难的一步向前遍历实现 RTL 流反转 缓冲区实现 LTR 片段保留再辅以括号镜像、标签保护和 emoji 代理对处理让波斯语、阿拉伯语、希伯来语在 Unity 中获得了开箱即用的富文本体验。理解了随到随写 / 攒够倒出这一核心模式你也能举一反三为自己的项目写出类似的双向文本处理逻辑。【免费下载链接】RTLTMProRight-To-Left Text Mesh Pro for Unity. This plugin adds support for Persian and Arabic languages to TextMeshPro.项目地址: https://gitcode.com/gh_mirrors/rt/RTLTMPro创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考