Doplňky k Apple TV 字符串看起来像是来自 Apple 网站。当我在他们的网站上查看时,这个字符串包含Apple 和TV 之间的NO-BREAK SPACE (U+00A0)。它是一个空格字符,但不等于普通的SPACE (U+0020)。
"Doplňky k Apple\u{00a0}TV" == "Doplňky k Apple TV" // false
首先要指定 - 重要吗?我们是否应该平等对待?
然后你有Apple TVtilbehør & *Apple*TV*Tilbehør* 字符串。是故意错字吗?还是Apple TVtilbehør 应该是Apple TV Tilbehør?让我们假设这是为了测试您的比较而故意拼写错误。
接下来,*Apple*TV*Tilbehør* 字符串中的这些*(在开头/结尾)是...? 第二件事要说明——我们应该忽略它们吗?它们代表空格吗?
接下来是Unicode equivalence。您想如何比较这两个字符串? Swift 在这里为您提供帮助 (source):
使用等于运算符 (==) 或关系运算符(如 < 或 >=)比较字符串是否相等始终使用 Unicode 规范表示。结果,字符串的不同表示比较相等。
"Cafe\u{301}" == "Café" // true
其他国家呢?像德国一样,Straße 等于 Strasse? 要指定的第三件事 - 我们应该如何处理这些字符串?
如您所见,有很多事情需要考虑。你有规格吗?跟着它。没有规范?你的算法迟早会停止工作。
游乐场
我冒昧地自行指定了所有这些内容:
- 所有空格都相等
-
* 开头/结尾无所谓(忽略)
-
Straße 不等于 Strasse
示例代码:
import Foundation
let json = [
// U+00A0 is NO-BREAK SPACE which looks like a normal space (U+0020)
"cz": "Doplňky k Apple\u{00a0}TV",
"dk": "Apple TV Tilbehør",
"en": "Hello",
"de": "Straße",
"fr": "Expos\u{00E9}" // Exposé
]
let plist = [
"cz": "Doplňky*k*Apple*TV",
"dk": "*Apple*TV*Tilbehør*",
"es": "Hola",
"de": "Strasse",
"fr": "Expose\u{0301}" // Exposé
]
let jsonKeys = Set(json.keys)
let plistKeys = Set(plist.keys)
let commonKeys = jsonKeys.intersection(plistKeys)
let keysMissingInJson = plistKeys.subtracting(jsonKeys)
let keysMissingInPlist = jsonKeys.subtracting(plistKeys)
print("Languages missing in JSON: \(keysMissingInJson.count)")
keysMissingInJson.forEach { key in
print(" - \(key)")
}
print("Languages missing in PLIST: \(keysMissingInPlist.count)")
keysMissingInPlist.forEach { key in
print(" - \(key)")
}
let differentValueKeys: [String] = commonKeys.compactMap { key in
guard let initialJsonValue = json[key], let initialPlistValue = plist[key] else {
fatalError("Fix commonKeys")
}
// Replace all whitespace characters with a normal space
let jsonValue = String(
initialJsonValue.map { $0.isWhitespace ? " " : $0 }
)
let plistValue = initialPlistValue
// Replace all * with a normal whitespace
.replacingOccurrences(of: "*", with: " ")
// Trim all whitespace characters from the beginning/end
.trimmingCharacters(in: .whitespaces)
return jsonValue == plistValue ? nil : key
}
print("Different values: \(differentValueKeys.count)")
differentValueKeys.forEach { key in
print(" - \(key): JSON(\(json[key]!)) PLIST(\(plist[key]!))")
}
输出:
Languages missing in JSON: 1
- es
Languages missing in PLIST: 1
- en
Different values: 1
- de: JSON(Straße) PLIST(Strasse)