【问题标题】:Convert characters to HTML Entities in Cocoa在 Cocoa 中将字符转换为 HTML 实体
【发布时间】:2009-02-21 13:41:02
【问题描述】:

我目前正在尝试将我指定一些 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) 你应该使用谷歌的翻译API,而不是抓取他们的网站:code.google.com/apis/ajaxlanguage/documentation
  • 技术上这不是添加 HTML 实体;它正在为非法 URI 字符添加百分比转义

标签: cocoa html-entities


【解决方案1】:

要正确地对参数进行 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:

    【讨论】:

      【解决方案3】:

      这是您可以在互联网上找到的 NSString 扩展

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

      解码部分在将数组索引映射到实际实体编号时有一些错误。不过既然你只需要编码,那么用它就可以了。

      【讨论】:

        【解决方案4】:

        对于字符串的简单 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]];
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-28
          • 2023-03-30
          • 2017-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多