+ (instancetype) URLWithString returns nil 当我尝试输入非拉丁字符时

+ (instancetype) URLWithString returns nil when I try to put non-latin character

我知道我遇到了什么错误,但是我不知道如何决定它。在我的 Cocoa 应用程序中遇到 Þþ, Ðð, Ææ 等字母是可以的。

通过我放置的断点,我发现每次放置至少一个非拉丁字符时 URLWithString returns nil。否则,returns 一些新的 URL 仅基于拉丁字符。

部分尝试片段:

NSString *baseURLString = @"https://hostdomain.com";
NSString *pathURLString = @"/restapi/someRequest?par1=arg1&par2=arg2&input=";
NSString *fullURLString = [NSString stringWithFormat:@"%@%@móðir", baseURLString, pathURLString];
NSURL *url = [NSURL URLWithString:fullURLString]; // here I get a nil while working with non-latin characters.

我仍在努力寻找解决方案,但 none 这里关于 Whosebug 的决定对我没有帮助。任何想法将不胜感激!我的想法是 URLWithString 只适用于 ASCII 符号..

URLWithString 仅适用于有效的 URL。您传递的某些字符对于 URL 的查询部分无效。参见 section 2 of RFC 3986。由于 URL 无效,因此 returns nil.

如果您的 URL 中有任意字符,您不应尝试将其全部构建为单个字符串,因为 URL 的每个部分都需要不同的编码。您需要使用 NSURLComponents。这将自动正确地转义每个部分。

NSURLComponents *comp = [NSURLComponents new];
comp.scheme = @"https";
comp.host = @"hostdomain.com";
comp.path = @"/restapi/someRequest";
comp.query = @"par1=arg1&par2=arg2&input=óðir";

NSURL *url = comp.url;
// https://hostdomain.com/restapi/someRequest?par1=arg1&par2=arg2&input=%C3%B3%C3%B0ir

或者,由于 URL 的基础部分是静态的并且您知道它的编码正确,您可以这样做:

NSURLComponents *comp = [NSURLComponents componentsWithString:@"https://hostdomain.com/restapi/someRequest"]
comp.query = @"par1=arg1&par2=arg2&input=óðir"

如果你真的想更直接地构建字符串,你可以看看stringByAddingPercentEncodingWithAllowedCharacters:。使用 [NSCharacterSet URLQueryAllowedCharacterSet] 作为查询部分。