2009-02-21 55 views
3

我目前正在試圖將指定一些GET參數的URL放在一起。但我想在這個URL中使用日文或其他字符。將字符轉換爲Cocoa中的HTML實體

有沒有辦法將NSString轉換爲包含我的NSString中'特殊'字符的HTML實體的字符串?

我目前使用下面的代碼,這似乎工作,除了像「特殊字符」中國和日本:

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,ESP。如果你不使用GC或者你正在編寫一個框架。 (2)您應該使用谷歌的翻譯API,而不是剽竊他們的網站:http://code.google.com/apis/ajaxlanguage/documentation/ – 2009-02-21 15:49:53

+1

從技術上講,這不是添加HTML實體;它會爲非法URI字符添加百分比轉義 – sbooth 2009-02-21 19:10:18

回答

4

要正確地對您的參數進行網址編碼,您需要將每個名稱和值轉換爲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 

的方法,建立通過URL調用parts名稱 - 值對的陣列編碼每個鍵和值,然後用「=」一起連接它們。然後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

NSString有一個方法-stringByAddingPercentEscapesUsingEncoding:

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 => +轉換步驟那種被騙,但它似乎工作得很好,我已經使用它一段時間了,我的應用程序中有很多網址。

用法是blessfully簡單:

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