Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS上的表情符号序列处理不一致?_Ios_Swift_Macos_Unicode_Emoji - Fatal编程技术网

iOS上的表情符号序列处理不一致?

iOS上的表情符号序列处理不一致?,ios,swift,macos,unicode,emoji,Ios,Swift,Macos,Unicode,Emoji,在iOS和macOS上,的序列显示为国旗表情符号,如果序列无效,则显示实际符号: 但是,如果序列碰巧包含一对区域指示符号,而这些区域指示符号没有映射到标志表情符号,则可能的标志将在第一次匹配的基础上呈现: iOS/macOS呈现符号:F I S E S 在Swift 3中,连续的区域指示符号都集中到一个字符,这意味着一个字符对象可以包含理论上无限数量的UnicodeScalar对象,只要它们都是区域指示符号。从本质上讲,Swift 3根本没有打破区域指标符号 另一方面,在Swift 4中,一

在iOS和macOS上,的序列显示为国旗表情符号,如果序列无效,则显示实际符号:

但是,如果序列碰巧包含一对区域指示符号,而这些区域指示符号没有映射到标志表情符号,则可能的标志将在第一次匹配的基础上呈现:

iOS/macOS呈现符号:F I S E S

在Swift 3中,连续的区域指示符号都集中到一个
字符
,这意味着一个
字符
对象可以包含理论上无限数量的
UnicodeScalar
对象,只要它们都是区域指示符号。从本质上讲,Swift 3根本没有打破区域指标符号

另一方面,在Swift 4中,一个
字符
对象在其Unicode标量表示中最多包含两个区域指示符号。此外,可以理解的是,没有考虑序列的有效性,因此区域指示符号序列仅在每两个标量处被分解,并被视为
字符
。现在,重复上述相同字符串并打印每个字符会产生以下结果:

包含符号的Swift 4字符串:F I S E S

这就引出了一个实际问题——是iOS和macOS如何呈现序列的问题,还是Swift 4如何构建字符串中的
字符
表示的问题

我很好奇,哪一方最适合向他报告这种怪癖


以下是Swift 4中行为的最小可复制片段:

// Regional indicator symbols F F I S E S
var string = "\u{1f1eb}\u{1f1eb}\u{1f1ee}\u{1f1f8}\u{1f1ea}\u{1f1f8}"

for character in string {
    print(character)
}

经过一些调查,似乎两者都没有错,尽管Swift 4中实施的方法更符合建议

根据Unicode标准(重点):

单个区域指示符号的代表性图示符只是一个包含大写拉丁字母的虚线框。Unicode标准没有规定如何呈现区域指示符号对。然而,当前的行业实践广泛地将成对的区域指示符号解释为代表与相应的ISO 3166区域代码相关联的标志

-,第836页

然后,在下一页:

符合Unicode标准并不要求符合UTS#51。然而,UTS#51中规定的区域指示符号对的解释和显示现在已经广泛应用,因此在实践中,不建议尝试将区域指示符号对解释为表示表情符号以外的任何符号

–Unicode标准,版本10.0–核心规范,第837页

由此我推断,虽然标准没有为如何呈现标志设置任何规则,但在iOS和macOS中处理无效标志序列的呈现所选择的路径是不可取的。因此,即使在序列中还存在有效标志,渲染器也应该始终考虑两个连续的区域指示符符号作为标志。 最后,看看UTS#51或“表情符号规范”:

显示系统没有特定标志或其他标志符号的表情符号标志序列的选项包括:

  • 如Unicode图表所示,将每个区域指示符号分别显示为虚线方框中的字母。这提供了有关指定区域的信息,但可能会让某些用户感到困惑

  • 对于所有不受支持的区域指示器对,显示相同的“缺失标志”图示符,如下图所示。这将表明受支持的对旨在表示某个区域的标志,而不指示哪个区域

第二章,附件B


因此,总而言之,最佳做法是将无效的标志序列表示为一对区域指示符号(与Swift 4字符串中的
字符
对象的情况完全相同),或表示为通用的缺失标志符号。

很好。我认为这是算法之间的不一致。这种行为在第一次匹配的基础上仍然有效。考虑字符串<代码> \{1f19a}\ u {1f1eb}\ u {1f1EE}\ u {1f1f8}\ u {1f1ea}\ u {1f1f8}\ <代码>…@ @ L ' L,这是什么意思?code>U+1f19a不是一个区域指标符号,所以我看不出这与这个问题有什么关系。而
\U{1f1eb}
本身就是?@l'l是的,区域指标符号都是
U+1F1E6…U+1F1FF
范围内的代码点。它们本身就是区域指标符号,但在一个序列中,恰好两个区域指标符号可以形成一个整体。