在Cocoa中将字符转换为HTML实体

3

我目前正在尝试组合一个URL,其中包含一些GET参数。但是我也想在这个URL中使用日语或其他字符。

有没有一种方法将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];

几个无关的要点:(1)确保释放您已分配的内容,特别是如果您没有使用GC或正在编写框架。 (2)您应该使用Google的翻译API,而不是抓取他们的网站:http://code.google.com/apis/ajaxlanguage/documentation/ - Peter Hosey
1
从技术上讲,这并不是添加HTML实体;它是为非法URI字符添加百分号转义。 - sbooth
4个回答

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

该方法通过对每个键和值进行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:

该方法可以将字符串转换为百分号编码的字符串,以便在URL中使用。

1

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。

使用起来非常简单:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接