2009-02-21 3 views
3

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

Есть ли способ конвертировать 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]; 
+0

Пара несвязанных пунктов: (1) Убедитесь, что вы отпустите, что вы allocked, особ. если вы не используете GC или вы пишете фреймворк. (2) Вы должны использовать API перевода Google, а не очищать свой сайт: http://code.google.com/apis/ajaxlanguage/documentation/ –

+1

Технически это не добавление объектов HTML; это добавление процента побега для незаконных символов URI. – sbooth

ответ

4

Для правильного 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]]; 
+0

Это замечательно. Благодарю. –

2

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

1

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

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

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

0

Для простого 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-адресов в своем приложении.

Использование является blessfully легко:

- (NSString *)URLForSearch: (NSString *)searchFor 
{ 
    return [@"http://example.org/search?query=" 
        stringByAppendingString: [searchFor urlencode]]; 
} 
Смежные вопросы