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¨
,变音符号 (¨
) 和 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
获取更多信息。
具体来说,它将带有变音符号的字符编码为两个字符。
let unencoded = "könnten"
let encoded = unencoded.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
encoded
则等于 ko%CC%88nnten
。因此,它将 ö
转换为 o%CC%88
。所以它真的很像 o¨
,变音符号 (¨
) 和 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 获取更多信息。