我知道我遇到的错误是什么,但我不知道如何决定它。可以在我的Cocoa App中遇到Þþ, Ðð, Ææ
等字母。
通过断点,我发现每当我至少放一个非拉丁字符时,我URLWithString
都会返回nil。否则,仅根据拉丁字符返回一些新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.
我仍在尝试寻找解决方案,但stackoverflow上的决定都没有帮助我。任何想法将不胜感激!我的想法是URLWithString
仅适用于ASCII符号..
答案 0 :(得分:2)
URLWithString
仅适用于有效的网址。您传递的某些字符对URL的查询部分无效。见section 2 of RFC 3986。由于URL无效,因此返回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]
作为查询部分。