Creator原生版引擎是如何处理梵文中的连字的

当两个字符连在一起时
需要组合成一个顺序颠倒的字形
似乎没有看到使用HarfBuzz库
还是说是通过排版做到的?

中文换行都处理不好,还梵文。。。

兄弟,你解决这个问题了嘛,我用印地语也遇到这个问题。bmfont用不了。ttf是正常的

太小众了,引擎还有一堆该有的功能都没有

不懂梵文,但泰文也是连字,连着两个Unicode不能拆开显示,论坛里面有帖子处理过的

哪里?我没找到呢

重写 cc.textUtils ,添加对梵文,泰语的支持。区分行字母,首字母,和分词检测 检测

1赞

fnt是支持的,是bmfont不支持,我们之前用了glyph designer做艺术字体,导出fnt。
以后除非是不考虑支持上面那些地区,不然多语言部分,就不能使用bmfont了。

我来分析一下这个文本处理工具类对梵文处理可能存在的问题,并给出改进建议。

当前问题分析

1. Unicode 范围覆盖不足

当前文件中的正则表达式主要针对:

  • 中日韩文字 (CJK)
  • 拉丁字母扩展 (欧洲语言)
  • 西里尔字母 (俄语等)

缺失: 梵文使用的 Devanagari 文字 (Unicode 范围 U+0900-U+097F)

2. isUnicodeCJK 函数问题 (第 174-179 行)

export function isUnicodeCJK (ch: string) {
    const __CHINESE_REG = /^[\u4E00-\u9FFF\u3400-\u4DFF]+$/;
    const __JAPANESE_REG = /[\u3000-\u303F]|[\u3040-\u309F]|[\u30A0-\u30FF]|[\uFF00-\uFFEF]|[\u4E00-\u9FAF]|[\u2605-\u2606]|[\u2190-\u2195]|\u203B/g;
    const __KOREAN_REG = /^[\u1100-\u11FF]|[\u3130-\u318F]|[\uA960-\uA97F]|[\uAC00-\uD7AF]|[\uD7B0-\uD7FF]+$/;
    return __CHINESE_REG.test(ch) || __JAPANESE_REG.test(ch) || __KOREAN_REG.test(ch);
}

问题: 没有检测梵文 Devanagari 字符的逻辑

3. 正则表达式缺少梵文字符 (第 159-165 行)

const WORD_REG = /([a-zA-Z0-9ÄÖÜäöüßéèçàùêâîôûа-яА-ЯЁё]+|\S)/;
const LAST_WORD_REG = /([a-zA-Z0-9...]+|\S)$/;
const LAST_ENGLISH_REG = /[a-zA-Z0-9...]+$/;
const FIRST_ENGLISH_REG = /^[a-zA-Z0-9...]/;

问题: 这些正则表达式没有包含 Devanagari 字符范围,导致:

  • 单词分割错误
  • 文本截断位置不正确
  • 换行处理异常

4. isEnglishWordPartAtFirst/AtLast 函数误判 (第 251-273 行)

这些函数使用 FIRST_ENGLISH_REGLAST_ENGLISH_REG,会将梵文误判为英文或其他拉丁文字

改进建议

建议 1: 添加梵文检测函数

// 新增:检测是否为梵文 Devanagari 字符
export function isUnicodeDevanagari(ch: string): boolean {
    const __DEVANAGARI_REG = /^[\u0900-\u097F]+$/;
    return __DEVANAGARI_REG.test(ch);
}

建议 2: 扩展 Unicode 空格检测

梵文可能使用特殊的空格或连接符,考虑在 isUnicodeSpace 中添加:

  • Zero Width Joiner (U+200D)
  • Zero Width Non-Joiner (U+200C)
  • Devanagari-specific marks

建议 3: 修改正则表达式,包含 Devanagari 范围

在所有单词相关的正则表达式中添加 \u0900-\u097F 范围:

// 例如 WORD_REG 应该改为:
const WORD_REG = /([a-zA-Z0-9ÄÖÜäöüßéèçàùêâîôûа-яА-ЯЁё\u0900-\u097F]+|\S)/;

建议 4: 添加梵文专用的单词边界检测

由于梵文有特殊的连字规则 (Matra、Nukta 等),建议:

  • 创建梵文专用的单词检测正则
  • 考虑梵文的组合字符特性 (一个字符可能由多个 code point 组成)

建议 5: 改进 fragmentText 函数的换行逻辑

在第 277-382 行的 fragmentText 函数中:

  • 增加对梵文特殊换行规则的判断
  • 避免在辅音连字 (Conjunct Consonants) 中间断行
  • 考虑 Matra(元音符号)不能与基字符分离的特性

建议 6: 添加辅助函数处理组合字符

// 建议新增:检测是否为 Devanagari 的组合标记
function isDevanagariMark(charCode: number): boolean {
    // U+0900-U+097F 是基本范围
    // U+093A-U+094E 是常见的 Matra 范围
    return (charCode >= 0x093A && charCode <= 0x094E);
}

建议 7: 优化 _safeSubstring 函数

当前函数只处理了代理对 (Surrogate Pairs),但梵文需要:

  • 检查是否截断了组合字符 (Base + Matra)
  • 确保不会分离连字字符

测试建议

修改后应该测试以下场景:

  1. 基本梵文字符: अ आ इ ई उ ऊ ए ऐ ओ औ
  2. 带 Matra 的字符: कि की कु कू के कै को कौ
  3. 连字字符: क्ष त्र ज्ञ श्र
  4. 混合文本: 梵文 + 英文 + 数字的混排
  5. 换行场景: 长文本自动换行时的断句位置

总结

核心问题是:缺少对 Devanagari 文字系统特性的支持,包括:

  • Unicode 范围未覆盖
  • 单词边界识别错误
  • 换行规则不兼容
  • 组合字符处理缺失

建议按优先级修改:

  1. 先添加梵文 Unicode 范围到所有相关正则
  2. 添加梵文检测函数
  3. 优化换行算法,考虑梵文特殊规则
  4. 完善组合字符的安全截断逻辑

这样可以逐步改善梵文文本的处理质量,而不会破坏现有其他语言的支持。

我没用过,我问了AI,他说的.