【问题标题】:combining multiple unicode character组合多个 unicode 字符
【发布时间】:2016-01-07 11:14:14
【问题描述】:

我想结合多个 unicode 代码点以使用 swift 语言打印一个字符


    let str:String = "\u{0C95}\u{0CBE}"
    let combinedCahr:Character = Character(str)

这会打印出ಕಾ

我的问题是:
我只想动态组合代码,如下所示。以下代码无法编译。


    let point1 = 0x0C95
    let point2 = 0x0CBE
    let str:String = "\u{(point1)}\u{(point2)}"
    let combinedCahr:Character = Character(str)
如何动态组合两个或多个 unicode 代码点以生成字符?

【问题讨论】:

  • 不应该是十六进制格式的“\u{(point1)}\u{(point2)}”吗?

标签: string swift unicode


【解决方案1】:

字符串"\u{0C95}\u{0CBE}" 由 Swift 编译器解释,不幸的是,这意味着您无法使用作为运行时操作的字符串插值来构建它。所以你需要寻找另一种方法。

String 有一个初始化器,它采用 UTF16 代码单元:

/// Returns an initialized `String` object that contains a
/// given number of characters from a given array of Unicode
/// characters.
public init(utf16CodeUnits: UnsafePointer<unichar>, count: Int)

当您看到某物采用 T 类型的 UnsafePointer 时,您可以使用 [T] 调用该函数。由于初始化程序也需要计数,因此只需构建一个 unichar 的 Swift 数组并将该数组及其计数传递给构造函数:

let point1: unichar = 0x0C95
let point2: unichar = 0x0CBE

let units = [point1, point2]
let str = String(utf16CodeUnits: units, count: units.count)
let combinedChar = Character(str)

【讨论】:

    【解决方案2】:

    组合字符串将(扩展的)字素簇组合成单个字符, 所以这是一个替代解决方案:

    let point1 = 0x0C95
    let point2 = 0x0CBE
    
    let s1 = String(UnicodeScalar(point1)) // "ಕ"
    let s2 = String(UnicodeScalar(point2)) // "ಾ"
    
    let combined = Character(s1 + s2) // "ಕಾ"
    

    另一个例子(代码点在“基本多语言平面”之外):

    let point1 = 0x1F1E9
    let point2 = 0x1F1EA
    
    let s1 = String(UnicodeScalar(point1)) // "?"
    let s2 = String(UnicodeScalar(point2)) // "?"
    
    let combined = Character(s1 + s2) // "??"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-27
      • 2013-09-22
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 2023-03-06
      • 2018-10-20
      • 1970-01-01
      相关资源
      最近更新 更多