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

SwiftUI中如何正确显示带内嵌数字的Aya节尾Unicode符号

SwiftUI 实现带数字的Aya节尾符号

预期效果

带数字的Aya节尾符号预期效果

问题根源

你之前使用的\u{FC00}属于Unicode私用区字符,没有统一的字形标准,依赖特定字体才能显示,不同系统版本、运行环境下渲染结果不可控,这就是偶发加载失败的原因。同时私用区字符本身不支持嵌套数字的能力,无法直接填入节号。

标准实现方案

古兰经Aya节尾标记有通用的标准Unicode实现,不需要依赖私有字符:

  • 基础装饰符使用U+06DD(字符形态:۝),属于阿拉伯语脚本标准字符,所有苹果系统自带字体都原生支持
  • 该字符是组合装饰字符,后面紧跟**东阿拉伯数字(U+0660 ~ U+0669)**时,会自动将数字包裹在符号内部,和你要的效果完全一致
  • 不要使用普通拉丁形态的0-9数字,否则无法触发自动嵌套效果

可直接复用的SwiftUI代码

import SwiftUI

// 可复用的Aya节尾标记组件
struct AyaVerseEndMarker: View {
    let verseNumber: Int
    
    // 东阿拉伯数字映射,对应0-9
    private let eastArabicDigits = Array("٠١٢٣٤٥٦٧٨٩")
    
    private var formattedVerseNumber: String {
        String(String(verseNumber).compactMap { c in
            guard let num = Int(String(c)) else { return nil }
            return eastArabicDigits[num]
        })
    }
    
    var body: some View {
        // 组合装饰符+格式化后的节号,自动渲染为带数字的节尾符号
        Text("\u{06DD}\(formattedVerseNumber)")
    }
}

// 测试页面
struct ContentView: View {
    var body: some View {
        VStack(spacing: 16) {
            AyaVerseEndMarker(verseNumber: 1)
            AyaVerseEndMarker(verseNumber: 7)
            AyaVerseEndMarker(verseNumber: 23)
            AyaVerseEndMarker(verseNumber: 114)
        }
        .font(.title3) // 可根据需求调整字号,符号和数字会同步缩放
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

方案优势

  • 渲染100%稳定,不依赖第三方字体,所有iOS 13+、macOS 10.15+系统都能正常显示
  • 自动适配数字位数,1位、2位、3位节号都能正常嵌套
  • 支持所有SwiftUI Text的原生修饰符,可直接调整字号、字重、颜色,不需要自定义绘制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:48:24