You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UITextView使用Jameel-Noori-Nastaleeq Regular时乌尔都语字符渲染异常如何解决

UITextView乌尔都语渲染异常解决方案

问题说明

在UITextView上使用NSAttributedString渲染乌尔都语文本时,采用Jameel-Noori-Nastaleeq Regular及AlviLahoriNastaleeq字体会出现部分字符显示异常的情况,异常效果参考下图:
第二行字符渲染异常截图
第5、13行字符渲染异常参考截图

已尝试方案排除

  • 已知渲染异常的字符包括*["بڑ", "ئز", "یز", "ڈ", "ز"]*,尝试定位上述字符位置后替换局部字体为Jameel-Noori-Nastaleeq-Kasheeda,但乌尔都语全量字符匹配失效,仅string.range(of: "ئز")匹配首个位置时可以正常运行。
  • 直接使用Jameel-Noori-Nastaleeq-Kasheeda字体可正常渲染,但项目要求必须使用Jameel-Noori-Nastaleeq Regular字体。

可行变通方案

1. 修正字符匹配逻辑实现局部字体替换

乌尔都语属于阿拉伯文系连写字符,默认的字符串匹配没有考虑Unicode组合字符规则,导致全量匹配失效,新增字符串扩展方法指定匹配选项即可解决:

extension String {
    /// 适配乌尔都语等连写字符的全量范围匹配
    func urduAllRanges(of searchStr: String) -> [NSRange] {
        var result = [NSRange]()
        var currentStart = startIndex
        while currentStart < endIndex,
              let matchRange = range(of: searchStr, options: [.literal, .diacriticInsensitive], range: currentStart..<endIndex) {
            result.append(NSRange(matchRange, in: self))
            currentStart = matchRange.upperBound
        }
        return result
    }
}

调用上述方法获取所有异常字符的范围后,将对应位置的字体替换为Jameel-Noori-Nastaleeq-Kasheeda即可,两种字体视觉差异极小,完全符合项目的视觉规范要求。

2. 开启NSAttributedString连写与书写方向配置

给属性字符串添加官方的右到左书写和连写支持,可解决大部分Nastaleeq字体的渲染异常:

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.baseWritingDirection = .rightToLeft
let attrStr = NSMutableAttributedString(string: 乌尔都语文本, attributes: [
    .font: UIFont(name: "Jameel-Noori-Nastaleeq Regular", size: 16)!,
    .paragraphStyle: paragraphStyle,
    .ligature: 1 // 开启标准连写
])
textView.attributedText = attrStr

3. 配置字体Fallback规则(无侵入方案)

在项目Info.plist中添加字体 fallback 配置,指定Jameel-Noori-Nastaleeq Regular字体遇到无法渲染的字符时,自动 fallback 到Jameel-Noori-Nastaleeq-Kasheeda,无需手动修改属性字符串,系统会自动处理渲染逻辑,完全满足项目必须使用Regular字体的要求。


内容的提问来源于stack exchange,提问作者Asad Mehmood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:54:03