Swift中对Unicode的区域标志表情符号支持

时间:2018-08-13 17:40:19

标签: swift unicode emoji flags

我的问题是

如何使用区域标志,例如,加利福尼亚州的标志(区域标志)

可以使用某些存在的苹果键盘区域标志(gbeng,gbzet,gbwls ...)

我使用了这样的unicode序列

let califonia = "\u{1F3F3}\u{E0075}\u{E0073}\u{E0063}\u{E0061}\u{E007F}"
print(califonia) // 

根据这些链接

但是它总是像这样显示白旗

是否可以使用区域标志的标志?

我的示例源在iPhone 4.1(iOS 11.4)的Swift 4.1中进行了测试

2 个答案:

答案 0 :(得分:2)

从Swift 4.0开始,Swift使用运行代码的操作系统的Unicode库(ICU)。因此,Swift本质上与底层操作系统具有相同的Unicode知识。

我刚刚在macOS 10.13.6上对此进行了测试,并且Swift 4.1(Xcode 9.4)和4.2(Xcode 10.5)均可正确处理区域标志表情符号。也就是说,它被识别为单个Character

let california = "\u{1F3F3}\u{E0075}\u{E0073}\u{E0063}\u{E0061}\u{E007F}"
california.count // returns 1 in Swift 4.1 on macOS 10.13.6

现在,Swift与呈现的方式无关,即与您的操作系统无关,也就是说,如果您的操作系统附带的字体中包含加利福尼亚州标志符号。这会因操作系统而异,并且当前的Apple操作系统似乎不包含字形(在我的测试中,该标志在iOS 12 beta 6上也显示为白色)。再次,这与Swift无关。

答案 1 :(得分:2)

这里没有Swift问题,但是有底层OS /平台和字体支持。

let california = "\u{E0075}\u{E0073}\u{E0063}\u{E0061}\u{E007F}"
california.count // .characters not needed / deprecated in Swift 4

这将正确返回1-根据Swift的字符串处理系统,您在此处只有一个表情符号字符。

但是,仅仅因为Swift根据Unicode 10.0 / Emoji 5.0规范将其视为单个字符,并不意味着您正在运行的任何平台都知道如何显示该字符。对于任何给定的标记序列,您是否看到正确的标志图像取决于您正在查看该序列的平台和字体是否包含该标记序列的图像/标志符号。

macOS,iOS和其他Apple平台随附的AppleColorEmoji字体包括该规范定义的某些区域/细分标志标签序列的字形,而不是每个可能的ISO 3166-2区域。具体来说,该字体仅包含在Unicode 10.0 / Emoji 5.0规范中被推荐用于“一般互换”的三个区域标签(如您的问题链接所指向的页面中所述):英格兰,苏格兰和威尔士。

允许平台或字体供应商(例如Apple或Twitter)为其他ISO 3166-2区域标签序列提供字体标志符号/图像。 (但是该规范不需要提供这样的规范即可声明合规性,因此大多数供应商都不需要。)在Apple的情况下,您至少可以file bugs要求获得更多支持……也许他们可以可以说服他们支持加利福尼亚,以便每台Mac上的精美文字都可以说类似“ ‍ byin”?