我目前正在尝试将一个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];
答案 0 :(得分: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
数组中的部分与'&amp;'连接在一起字符。
所以对你的例子来说:
#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]];
答案 1 :(得分:2)
NSString
有一个方法-stringByAddingPercentEscapesUsingEncoding:
答案 2 :(得分:1)
这是您可以通过互联网找到的NSString扩展
解码部分在将数组索引映射到实际实体编号时有一些错误。但由于你只需要编码,所以可以使用它。
答案 3 :(得分: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 =&gt;欺骗了+转换步骤,但它似乎都运行良好,我已经使用它一段时间了,我的应用程序中有大量的URL。
用法非常简单:
- (NSString *)URLForSearch: (NSString *)searchFor
{
return [@"http://example.org/search?query="
stringByAppendingString: [searchFor urlencode]];
}