Как кодировать URL - PullRequest
       2

Как кодировать URL

1 голос
/ 27 января 2011
NSString* urlEncode(NSString * url)
{
    string inStr = StringFromNSString(url);
    CFStringRef inStringRef = CFStringCreateWithCString( kCFAllocatorDefault, inStr.c_str(), kCFStringEncodingUTF8 );
    NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)inStringRef,NULL,(CFStringRef)@"!*’();:@&=+$,/?%#[]",kCFStringEncodingUTF8 );
    return encodedString;
}

Я использую описанный выше метод для кодирования URL-адреса ... даже если мое приложение падает, говоря

<body>
    <div id="content">
        <h1>An Error Was Encountered</h1>
        <p>The URI you submitted has disallowed characters.</p> </div>
</body>
</html>
terminate called after throwing an instance of 'std::invalid_argument'
  what(): 

Есть идеи? Что не так с моим кодом?

К вашему сведению: в этом методе происходит сбой JSONNode jsonObject0 = libJSON :: parse (inResponseData);

ОБНОВЛЕНО: сервер, которому я отправляю сообщение, является сервером UNIX, это вызывает проблему?

Ответы [ 7 ]

5 голосов
/ 27 января 2011

Вам не нужно создавать временные переменные inStr или inStringRef.Типы NSString* и CFStringRef являются типами "бесплатный телефонный мост".Эти типы взаимозаменяемы с простым приведением.

Вы можете найти больше информации о бесплатном мостовом соединении здесь: http://www.mikeash.com/pyblog/friday-qa-2010-01-22-toll-free-bridging-internals.html

Тем не менее, вы можете упростить свой метод до следующего:

-(NSString*) urlEncode
{
    NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes( NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );
    return [encodedString autorelease];
}

Вышелучше всего реализовывать как категорию NSString (обратите внимание на использование self в качестве значения для кодирования).

2 голосов
/ 28 мая 2013

Вы можете попробовать это

NSString *sampleUrl = @"http://www.google.com/search.jsp?params=Java Developer";
NSString* encodedUrl = [sampleUrl stringByAddingPercentEscapesUsingEncoding:
 NSASCIIStringEncoding];
2 голосов
/ 27 января 2011

Это прекрасно работает для меня.Я использую CFSTR вместо (CFStringRef) @ "! * '();: @ & = + $, /?% # []"

- (NSString *)encodedURLParameterString {
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                       (CFStringRef)self,
                                                                       NULL,
                                                                       CFSTR(":/=,!$& '()*+;[]@#?"),
                                                                       kCFStringEncodingUTF8);
    return [result autorelease];
 }
1 голос
/ 28 ноября 2012
NSString *encodedstring = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                                          (__bridge CFStringRef)yoururlstring,
                                                                                          NULL,
                                                                                       (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                       kCFStringEncodingUTF8);

этот код отлично работает

1 голос
/ 07 февраля 2011

Это была проблема на сервере UNIX ... Он выдавал неверные данные.

1 голос
/ 27 января 2011

Вы должны убедиться, что вы не кодируете URL больше, чем вам нужно.Если вы собираетесь использовать эту строку кодирования как часть реального URL, то вы должны знать, что есть только части URL, которые должны быть закодированы, а именно строка запроса (есть и другие биты, но95% времени, это связано с запросом).

Другими словами, ваш URL должен быть:

scheme://host/path?<key>=<value>&<key>=<value>

При этом ТОЛЬКО содержимое в угловых скобках (<key> и <value>) должно быть закодировано в URL.

0 голосов
/ 22 августа 2017

Вот лучший способ кодирования отформатированной строки URL:

urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

Вместо использования ниже, поскольку есть некоторые проблемы с управлением памятью.

NSString *encodedstring = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                                      (__bridge CFStringRef)yoururlstring,
                                                                                      NULL,
                                                                                   (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                   kCFStringEncodingUTF8);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...