Horray!
短い答えは、いいえ、私たちは実際にここで特別なことをしていないということです。基本的に我々はボンネットの下に行うすべては次のとおりです。
let str1 = "o\u{308}" // decomposed : latin small letter o + combining diaeresis
let str2 = "\u{f6}" // precomposed: latin small letter o with diaeresis
print(str1, str2, str1 == str2) // ö ö true
戻りtrue
:私の心を吹く
// This is the list at https://cloud.google.com/storage/docs/json_api/ without the & because query parameters
NSString *const kGCSObjectAllowedCharacterSet =
@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~!$'()*+,;=:@";
- (nullable NSString *)GCSEscapedString:(NSString *)string {
NSCharacterSet *allowedCharacters =
[NSCharacterSet characterSetWithCharactersInString:kGCSObjectAllowedCharacterSet];
return [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
}
何しても、そのです。Objectbase-C(Firebase Storageクライアントが組み込まれています)では、完全に異なる2文字のため、完全に異なるはずがありません(実際には、str1
の長さは2
ですが、str2
の長さはObj-Cの1
です) Swiftでは答えは両方とも1
と仮定しています)。
アップリュはSwiftで比較する前に文字列を正規化する必要があります(そうでなければ、文字列が「同じ」だが異なって比較されるthisのようなバグにつながるため)。これはまさに彼らがやっていることです(docsの "Extended Grapheme Clusters"セクションを参照)。
したがって、Swiftで2つの異なる文字を入力すると、それらは異なる文字としてObj-Cに伝播され、したがって異なるエンコードが行われます。バグではなく、SwiftのString
タイプとObj-CのNSString
タイプの多くの違いの1つです。疑問がある場合は、期待通りの標準表現を選択してください。しかし、図書館の開発者として、その表現を選択することは非常に難しいです。
したがって、Unicode文字を含むファイルに名前を付けるときは、標準表現(C、D、KC、またはKD)を選択して、必ず参照を作成するときに使用してください。
let imageName = "smorgasbörd.jpg"
let path = "images/\(imageName)"
let decomposedPath = path.decomposedStringWithCanonicalMapping // Unicode Form D
let ref = FIRStorage.storage().reference().child(decomposedPath)
// use this ref and you'll always get the same objects
URLがエスケープされていることを確認しましたか? 'Röda.png'はURLパスで' R%C3%B6da.png'になります。 –
@Code Firebase Storageの実際のURLパスは 'Ro%CC%88da' –