stringUmlauts.utf8
использует символы Unicode äöü
.
Но urlUmlauts.path.utf8
использует символы Unicode aou
, за которыми следует объединение ¨
.
Вот почему вы получаете другую кодировку base64 - символы выглядят одинаково, но фактически кодируются по-разному.
Что действительно интересно, так это то, что Array(stringUmlauts)
и Array(urlUmlauts.path)
одинаковы. Разница не появится, пока вы не выполните кодировку UTF-8 с точно такими же значениями String
.
Поскольку кодировка base64 не имеет значения, вот более краткий тест:
let stringUmlauts = "/path/to/file/with/umlauts/testäöü"
let urlUmlauts = URL(fileURLWithPath: stringUmlauts)
print(stringUmlauts, urlUmlauts.path) // Show the same
let rawStr = stringUmlauts
let urlStr = urlUmlauts.path
print(rawStr == urlStr) // true
print(Array(rawStr) == Array(urlStr)) // true
print(Array(rawStr.utf8) == Array(urlStr.utf8)) // false!!!
Так чем же отличается кодировка UTF-8 двух одинаковых строк?
Одним из решений этой проблемы является использование precomposedStringWithCanonicalMapping
в результате path
.
let urlStr = urlUmlauts.path.precomposedStringWithCanonicalMapping
Теперь вы получаете true
от:
print(Array(rawStr.utf8) == Array(urlStr.utf8)) // now true