+(instancetype)当我尝试放入非拉丁字符

时间:2018-04-19 11:16:00

标签: objective-c utf-8 nsstring nsstringencoding

我知道我遇到的错误是什么,但我不知道如何决定它。可以在我的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符号..

1 个答案:

答案 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]作为查询部分。