gpt4 book ai didi

swift - 为什么 Swift 将这个字素簇计为两个字符而不是一个字符?

转载 作者:搜寻专家 更新时间:2023-10-31 08:20:34 24 4
gpt4 key购买 nike

一般来说,Swift 真的很聪明,可以将字素簇计算为单个字符。例如,如果我想制作一面黎巴嫩国旗,我可以将这两个 Unicode 字符组合起来

  • U+1F1F1 区域指标符号字母 L
  • U+1F1E7 区域指标符号字母 B

正如预期的那样,这是 Swift 中的一个字符:

let s = "\u{1f1f1}\u{1f1e7}"
assert(s.characters.count == 1)
assert(s.utf16.count == 4)
assert(s.utf8.count == 8)

但是,假设我想制作 Fitzpatrick Type-5 的自行车表情符号。如果我结合

  • U+1F6B4 骑自行车的人
  • U+1F3FE EMOJI 修改器 FITZPATRICK TYPE-5

Swift 将此组合计为两个 个字符!

let s = "\u{1f6b4}\u{1f3fe}"
assert(s.characters.count == 2) // <----- WHY?
assert(s.utf16.count == 4)
assert(s.utf8.count == 8)

为什么这是两个字符而不是一个?

为了说明为什么我期望它是 1,请注意这个簇实际上被解释为有效的表情符号:

enter image description here

最佳答案

部分答案在bug report中给出在 emrys57 的评论中提到。将 Unicode 字符串拆分为“字符”时,Swift 显然使用了 UAX #29 Unicode Text Segmentation 中定义的字素簇边界。 .有一个 rule not to break between regional indicator symbols , 但表情符号修饰符没有这样的规则。因此,根据 UAX #29,字符串 "\u{1f6b4}\u{1f3fe}" 包含两个字素簇。参见 this message来自 Unicode 邮件列表上的 Ken WhiSTLer 的解释:

This results from the fact that the fallback behavior for the modifiers is simply as independent pictographic blorts, i.e. the color swatch images. [...] You need additional, specific knowledge about these sequences -- it doesn't just fall out from a default implementation of UAX #29 rules for grapheme clusters.

关于swift - 为什么 Swift 将这个字素簇计为两个字符而不是一个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35823611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com