Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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_Xcode_Sorting_Closures - Fatal编程技术网

Ios 字符串比较(>;)在不同的平台上返回不同的结果?

Ios 字符串比较(>;)在不同的平台上返回不同的结果?,ios,swift,xcode,sorting,closures,Ios,Swift,Xcode,Sorting,Closures,考虑以下谓词 print("S" > "g") 在Xcode上运行此命令会产生false,而在tutorialspoint的在线编译器或例如IBM Swift Sandbox(Swift Dev.4.0(2017年9月5日)/平台:Linux(x86_64))上运行此命令会产生true 为什么在线编译器(Linux?)上的谓词与vs Xcode上的谓词结果不同?这是一个已知的开放“bug”(或者更确切地说是一个已知的限制): 引用Dave Abrahams对open bug报告的评

考虑以下谓词

print("S" > "g")
在Xcode上运行此命令会产生
false
,而在tutorialspoint的在线编译器或例如IBM Swift Sandbox(Swift Dev.4.0(2017年9月5日)/平台:Linux(x86_64))上运行此命令会产生
true

为什么在线编译器(Linux?)上的谓词与vs Xcode上的谓词结果不同?

这是一个已知的开放“bug”(或者更确切地说是一个已知的限制):

引用Dave Abrahams对open bug报告的评论:

这将主要由新的字符串工作来修复,其中字符串的 默认排序顺序将实现为字典顺序 FCC标准化UTF16代码单元的数量

注意,在这两个平台上,我们都依赖ICU提供正常化服务, ICU不同实现之间的差异和规范化 这是一种真正的可能性,因此永远不能保证两个 任意字符串在两种平台上的排序相同

但是,对于示例中的拉丁-1字符串,新的 工作会解决问题的

此外,来自:

比较和散列字符串

在任何地方都遵循这一方案也将允许我们进行排序 跨平台的行为一致。目前,我们对字符串进行排序 据UCA称,除了——仅在苹果平台上——成对的 ASCII字符按unicode标量值排序

最有可能的是,根据UCA(Unicode排序算法)进行比较的OP(仅包括ASCII字符)的特定示例用于Linux平台,而在Apple平台上,这些单一ASCII字符
字符串
的排序(或;
字符串
实例以ASCII字符开头)是根据unicode标量值

// ASCII value
print("S".unicodeScalars.first!.value) // 83
print("g".unicodeScalars.first!.value) // 103

// Unicode scalar value
print(String(format: "%04X", "S".unicodeScalars.first!.value)) // 0053
print(String(format: "%04X", "g".unicodeScalars.first!.value)) // 0067

print("S" < "g") // 'true' on Apple platforms (comparison by unicode scalar value),
                 // 'false' on Linux platforms (comparison according to UCA)
//ASCII值
打印(“S”.unicodeScalars.first!.value)//83
打印(“g”.unicodeScalars.first!.value)//103
//Unicode标量值
打印(字符串(格式:“%04X”,“S”.unicodeScalars.first!.value))//0053
打印(字符串(格式:“%04X”,“g”.unicodeScalars.first!.value))//0067
在苹果平台上打印(“S”<“g”)/“true”(通过unicode标量值进行比较),
//Linux平台上的“错误”(根据UCA进行比较)
另请参见以下问答的最佳公认答案:


我试着使用代码,发现大写字母之间存在差异。当尝试用“S”和“G”代替“G”时,它给出了正确的结果。所以我猜这与此有关。如果对单个ASCII字符(如
“S”
“G”
)执行字典式比较,我们希望在比较中使用相应的ASCII值(或其unicode标量值:对于ASCII字符,相对顺序为ASCII->(十六进制)unicode标量将被保留)。如果是这样,自然地,
“S”
(ASCII 83)将优先于
“g”
(ASCII 103),而
“g”
(ASCII 71)将优先于
“S”
。苹果平台也是如此(正如我在回答中提到的),而Linux平台将根据UCA订购
“S”
vs
“g”
,并在
“S”
之前订购
“g”
。相关:@MartinR谢谢。我们是否应该将此线程作为该线程的副本关闭?@dfri我不认为它是副本…@FA95问题本身不是副本(完全是出于被问的动机),但链接线程中的答案提供了足够的信息(类似于我自己的答案)来回答它。对于这种情况,甚至鼓励复制标记线程,因为它们将被连接;一个访问另一个线程会发现这个线程,反之亦然。