URL形式にUITextView / UITextFieldの中にスペースをコードします
-
06-09-2019 - |
質問
私は、PHPファイルへのパラメータとして、UITextViewまたはUITextFieldの内容を送信しようとしている。
NSString *urlstr = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",nameField.text, tagsField.text, dreamEntry.text];
私はurlstrをログインするとUITextViewまたはUITextFieldにはスペースが含まれていないとして、URL形式はちょうど限りokです。どのように私は20%にスペースを変換するに行くか?
編集
ここでは、現時点でのコードだけでなく、クラッシュがあるが、適切にURLをコード化されていません。
名前=ジョン・ドウ&タグ=経常悪夢&エントリー=テストテストテスト
に変換される
名前=ジョン-1844684964oe&タグ= recurringightmare&エントリー=テスト4.214929e-307sting -1.992836e + 00sting
- (IBAction)sendButtonPressed:(id)sender
{
NSString *urlString = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@", nameField.text, tagsField.text, dreamEntry.text];
NSString *encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [[NSURL alloc] initWithString:encodedString];
NSLog(encodedString);
NSLog(urlString);
[urlString release];
[url release];
[encodedString release];
}
解決
あなたは、文字列全体をURL-逃れることになっていない、あなたは、URL-脱出動的コンポーネントことになっています。試してみてください。
NSString *urlStr = [NSString stringWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",
[nameField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
[tagsField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
[dreamEntry.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
nil];
NSURL *url = [NSURL URLWithString:urlStr];
あなたのコード(と間違いなく奇数印刷する理由)を有する第二の問題は、あなたがのNSLogに直接文字列を渡しているので、それは、フォーマット文字列として扱われています。あなたが使用する必要があります。
NSLog(@"%@", encodedString);
の代わりに。それが期待どおりに印刷になります。
編集:あなたのコードを持つ第三の問題は、あなたが最後にそれらすべてを解放し、その後、自動解放と所有するオブジェクトを混合しています。作成した3つのオブジェクトを見て行き、あなたはその後、後でそのリリース。それは言葉のアロケーション、コピー、または新規に開始しなかった方法で作製したので、そのうちの一つが、後に解放すべきではありません。問題のオブジェクトを識別することは読者に任せる運動です。
他のヒント
実は、前回の回答のすべてが提供されたユーザーの多くの一般的な値のためのTextField内のテキストが正しくサーバー
と通信できないだろう、少なくともいくつかの誤りを含み、 stringByAddingPercentEscapesUsingEncoding:
パーセントは、有効なURL文字はないすべての文字をエスケープします。この方法は、全体のURLを一度に適用する必要があります。
前の答えはstringByAddingPercentEscapesUsingEncoding:
あなたはURL文字列全体に適用するべきではありません多くのスクリプト言語でURLの建物のクラスのように動作しますが、そうでないと主張しています。誰でも簡単にエスケープされていない&
sと?
sのために、その出力をチェックすることでこれを確認することができます。だから、文字列全体に適用する細かいですが、あなたの「動的」のURLコンテンツに適用するだけでは十分ではない。
前の答えは、あなたのCGIクエリ文字列に入る名前と値にはいくつかのより多くの仕事をしなければならないという点で、権利です。 CGIは、RFC3875で指定されているので、これは、多くの場合、RFC3875パーセントエスケープと呼ばれます。それはあなたの名前と値が有効なURL文字ですが、URLの他の部分(;
、?
、:
、@
、&
、=
、$
、+
、{
、}
、<
で重要でどの文字が含まれていないことを確認します、>
、及び,
)
しかし、また、文字列中のすべての文字が有効なURL文字であることを確認するために完全な文字列でプレーンなURLパーセントエスケープを行うことによって仕上げることが非常に重要です。あなたはあなたの例ではないが、一般的に有効なURL文字ではありませんので、あなたにもそれらをエスケープする必要があります文字列の「静的」部分に文字があるかもしれません。
残念ながら、NSString
は、私たちがそうすることをCFString
にダウン浸漬する必要がありますのでRFC3875の重要な文字をエスケープするために力を与えるものではありません。私は、一般的にそうようCFString
にCategory
を追加するように、明らかに痛みがNSString
をされて使用します:
@interface NSString (RFC3875)
- (NSString *)stringByAddingRFC3875PercentEscapesUsingEncoding:(NSStringEncoding)encoding;
@end
@implementation NSString (RFC3875)
- (NSString *)stringByAddingRFC3875PercentEscapesUsingEncoding:(NSStringEncoding)encoding {
CFStringEncoding cfEncoding = CFStringConvertNSStringEncodingToEncoding(encoding);
NSString *rfcEscaped = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@";/?:@&=$+{}<>,",
cfEncoding);
return [rfcEscaped autorelease];
}
@end
は、代わりにこのCategory
では、元の問題を正しく次で解決することができます:
NSString *urlEscapedBase = [@"http://server.com/file.php" stringByAddingPercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *rfcEscapedName = [nameField.text stringByAddingRFC3875PercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *rfcEscapedTags = [tagsField.text stringByAddingRFC3875PercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *rfcEscapedEntry = [dreamEntry.text stringByAddingRFC3875PercentEscapesUsingEncoding:
NSUTF8StringEncoding];
NSString *urlStr = [NSString stringWithFormat:@"%@?name=%@&tags=%@&entry=%@",
urlEscapedBase,
rfcEscapedName,
rfcEscapedTags,
rfcEscapedEntry];
NSURL *url = [NSURL URLWithString:urlStr];
これは単に、より明確に少し可変重です。またstringWithFormat:
に設けられた可変リストが終了nil
すべきではないことに注意してください。フォーマット文字列は、それに従うべき変数の正確な数を示します。また、クエリ文字列の名前(名、タグ、エントリー、...)のための技術的に文字列が当然のこととしてstringByAddingPercentEscapesUsingEncoding:
を介して実行されなければならないが、この小さな例では、我々は簡単に、彼らが無効なURLの文字が含まれていないことを確認できます。
前のソリューションが間違っている理由を確認するには、dreamEntry.text
におけるユーザ入力テキストはそうではない&
が、含まれていることを想像してみてください。以前のソリューションでは、その文字以下のすべてのテキストがエスケープされていないアンパサンドは、そのクエリ文字列ペアの値の部分を終了すると、サーバによって解釈されるため、サーバは、そのテキストを得た時点で失われてしまう。
あなたはあなたのURLや使用を取ることができます:
NSString *urlStr = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",nameField.text, tagsField.text, dreamEntry.text];
NSString *encStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];