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

将Cocoa中的字符转换为HTML实体,cocoa,html-entities,Cocoa,Html Entities,我目前正在尝试创建一个URL,在其中指定一些GET参数。但我想在这个URL中使用日语或其他字符 有没有办法将NSString转换为包含我的NSString中“特殊”字符的HTML实体的字符串 我目前正在使用以下代码,除了像中文和日文这样的“特殊字符”之外,这些代码似乎都能正常工作: NSString* url = @"/translate_a/t?client=t&sl=auto&tl="; url = [url stringByAppendingString:destinati

我目前正在尝试创建一个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];

NSString
有一个方法
-stringByAddingPercentEscapesUsingEncoding:

这是您可以在internet上找到的NSString扩展名


解码部分在将数组索引映射到实际实体号时出错。但是,因为您只需要编码,所以可以使用它。

要正确地对参数进行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编码,我看到的许多解决方案虽然在技术上是正确的,但看起来并不像我希望的那么容易使用。因此,我提出了以下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]];
}

两个不相关的要点:(1)确保发布您所分配的内容,特别是在您没有使用GC或正在编写框架的情况下。(2) 你应该使用谷歌的翻译API,而不是删除他们的网站:从技术上讲,这不是添加HTML实体;它正在为非法URI字符添加转义百分比
- (NSString *)URLForSearch: (NSString *)searchFor
{
    return [@"http://example.org/search?query="
                   stringByAppendingString: [searchFor urlencode]];
}