Преобразование символов в HTML-объекты в Какао - PullRequest
3 голосов
/ 21 февраля 2009

В настоящее время я пытаюсь собрать URL-адрес, где я указываю некоторые параметры GET. Но я также хочу использовать японские или другие символы в этом URL.

Есть ли способ преобразовать строку NSString в строку, содержащую объекты HTML для «специальных» символов в моей строке NSString?

В настоящее время я использую следующий код, который, кажется, работает, за исключением «специальных символов», таких как китайский и японский:

NSString* url = @"/translate_a/t?client=t&sl=auto&tl=";
url = [url stringByAppendingString:destinationLanguage];
url = [url stringByAppendingString:@"&text="];
url = [url stringByAppendingString:text];

NSURL* nsurl = [[NSURL alloc] initWithScheme:@"http" host:@"translate.google.com" path:url]; 

NSError* error;
NSString* returnValue = [[NSString alloc] initWithContentsOfURL:nsurl encoding:NSUTF8StringEncoding error:&error];

Ответы [ 4 ]

4 голосов
/ 21 февраля 2009

Чтобы правильно URL-кодировать ваши параметры, вам нужно преобразовать каждое имя и значение в UTF-8, затем URL-кодировать каждое имя и значение отдельно, затем объединить имена со значениями, используя '=', и пары имя-значение, используя '&' .

Как правило, мне проще поместить все параметры в NSDictionary, а затем построить строку запроса из словаря. Вот категория, которую я использую для этого:

// file NSDictionary+UrlEncoding.h
#import <Cocoa/Cocoa.h>

@interface NSDictionary (UrlEncoding)

-(NSString*) urlEncodedString;

@end


// file NSDictionary+UrlEncoding.m
#import "NSDictionary+UrlEncoding.h"

// private helper function to convert any object to its string representation
static NSString *toString(id object) {
  return [NSString stringWithFormat: @"%@", object];
}

// private helper function to convert string to UTF-8 and URL encode it
static NSString *urlEncode(id object) {
  NSString *string = toString(object);
  return [string stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
}


@implementation NSDictionary (UrlEncoding)

-(NSString*) urlEncodedString {
  NSMutableArray *parts = [NSMutableArray array];
  for (id key in self) {
    id value = [self objectForKey: key];
    NSString *part = [NSString stringWithFormat: @"%@=%@", 
                     urlEncode(key), urlEncode(value)];
    [parts addObject: part];
  }
  return [parts componentsJoinedByString: @"&"];
}

@end

Метод создает массив пар имя-значение, называемый parts, с помощью URL-адреса, кодирующего каждый ключ и значение, а затем соединяя их вместе с '='. Затем части в массиве parts объединяются с помощью символов '&'.

Итак, для вашего примера:

#import "NSDictionary+UrlEncoding.h"
// ...
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
[parameters setValue: @"t" forKey: @"client"];
[parameters setValue: @"auto" forKey: @"sl"];
[parameters setValue: destinationLanguage forKey: @"tl"];
[parameters setValue: text forKey: @"text"];
NSString *urlString = [@"/translate_a/t?" stringByAppendingString: [parameters urlEncodedString]];
2 голосов
/ 21 февраля 2009

NSString имеет метод -stringByAddingPercentEscapesUsingEncoding:

1 голос
/ 21 февраля 2009

Вот расширение NSString, которое вы можете найти через интернет

http://code.google.com/p/wimframework/source/browse/trunk/WimFramework/Classes/Helpers/WimAdditions.m

Часть декодирования имеет некоторую ошибку при отображении индекса массива на фактический номер объекта. Но так как вам нужно только кодирование, его можно использовать.

0 голосов
/ 21 июля 2009

Для простого URL-кодирования строк многие из рассмотренных мною решений, хотя и технически правильные, выглядят гораздо менее простыми в использовании, чем мне бы хотелось. Итак, я придумал следующую категорию NSString:

@interface NSString (MLExtensions)

- (NSString *)urlencode;

@end


NSString *_mlfilterChars = @";/?:@&=+$,";

@implementation NSString (MLExtensions)

- (NSString *)urlencode
{
    return [[NSString stringWithString: (NSString *)
        CFURLCreateStringByAddingPercentEscapes(
            NULL, 
            (CFStringRef)self,
            NULL, 
            (CFStringRef)_mlfilterChars,
            kCFStringEncodingUTF8)]
               stringByReplacingOccurrencesOfString: @"%20" withString: @"+"];
}

@end

Я спешу с некоторыми другими вещами, над которыми я работаю, поэтому меня обмануло с шагом конвертации% 20 => +, но все это работает отлично, и я его использую какое-то время с большим количеством URL в моем приложении.

Использование очень удобно:

- (NSString *)URLForSearch: (NSString *)searchFor
{
    return [@"http://example.org/search?query="
                   stringByAppendingString: [searchFor urlencode]];
}
...