Foundation 的字符串编码不是网站所期望的

Foundation's string encoding isn't what sites are expecting

具体来说,它将带有变音符号的字符编码为两个字符。

let unencoded = "könnten"
let encoded = unencoded.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!

encoded 则等于 ko%CC%88nnten。因此,它将 ö 转换为 o%CC%88。所以它真的很像 ,变音符号 (¨) 和 o 是分开的。

然而,大多数网站似乎期望编码为 %C3%B6,即 ö,其中变音符号 (¨) 和 o 是一个单独的字符.

您可以在此处查看编码不起作用的示例(Foundation 想要如何对其进行编码):

https://www.linguee.com/german-english/search?query=ko%CC%88nnten

以及它的理想状态:

https://www.linguee.com/german-english/search?query=k%C3%B6nnten

有没有更好的编码方式?也许不同的选择或不同的框架?

理想情况下,服务器应该同时处理预合成和分解 字符串。但如有必要,您可以在 客户端:

let unencoded = "könnten"
let encoded = unencoded.precomposedStringWithCanonicalMapping
        .stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet())!

print(encoded) // k%C3%B6nnten

Technical Q&A QA1235 – Converting to Precomposed Unicode 获取更多信息。