+ (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]
作为查询部分。
我知道我遇到了什么错误,但是我不知道如何决定它。在我的 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]
作为查询部分。