UITextView使用Jameel-Noori-Nastaleeq Regular时乌尔都语字符渲染异常如何解决
UITextView乌尔都语渲染异常解决方案
问题说明
在UITextView上使用NSAttributedString渲染乌尔都语文本时,采用Jameel-Noori-Nastaleeq Regular及AlviLahoriNastaleeq字体会出现部分字符显示异常的情况,异常效果参考下图:

已尝试方案排除
- 已知渲染异常的字符包括*["بڑ", "ئز", "یز", "ڈ", "ز"]*,尝试定位上述字符位置后替换局部字体为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
相关产品推荐
相关产品推荐

