3

私は現在、いくつかのGETパラメータを指定するURLをまとめようとしています。ただし、この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];
4

4 に答える 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]];
于 2009-02-21T20:30:26.517 に答える
2

NSString方法があります-stringByAddingPercentEscapesUsingEncoding:

于 2009-02-21T15:05:02.557 に答える
1

これは、インターネット上で見つけることができる NSString 拡張機能です

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

デコード部分には、配列インデックスを実際のエンティティ番号にマッピングする際にエラーがあります。しかし、必要なのはエンコーディングだけなので、それを使用しても問題ありません。

于 2009-02-21T15:40:20.473 に答える
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]];
}
于 2009-07-21T09:27:07.717 に答える