gpt4 book ai didi

iphone - 将 UITextView/UITextField 中的空格编码为 URL 格式

转载 作者:行者123 更新时间:2023-12-03 18:33:26 25 4
gpt4 key购买 nike

我正在尝试将 UITextView 或 UITextField 的内容作为参数发送到 php 文件

NSString *urlstr = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",nameField.text, tagsField.text, dreamEntry.text];

当我记录 urlstr 时,只要 UITextView 或 UITextField 不包含空格,url 格式就可以。我该如何将空格转换为 %20 ?

编辑

这是目前的代码,它不仅崩溃而且没有正确编码 URL。

name=John Doe&tags=反复出现的噩梦&entry=测试测试测试

转换为

name=John -1844684964oe&tags=recurringightmare&entry=测试 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];


}

最佳答案

实际上,之前的所有答案都至少包含一些不准确之处,对于用户在文本字段中提供的文本的许多常见值来说,这些错误将无法与服务器正确通信

stringByAddingPercentEscapesUsingEncoding:% 转义所有非有效 URL 字符。此方法应该对整个 URL 应用一次。

之前的答案声称stringByAddingPercentEscapesUsingEncoding:的工作方式类似于许多脚本语言中的 URL 构建类,您不应将其应用于整个 URL 字符串,但事实并非如此。任何人都可以通过检查其输出中是否有未转义的&?来轻松验证这一点。因此,应用于整个字符串就可以了,但应用于“动态”网址内容还不够。

前面的答案是正确的,因为您必须对 CGI 查询字符串中的名称和值做更多的工作。由于 CGI 由 RFC3875 指定,因此通常称为 RFC3875 百分比转义。它确保您的名称和值不包含属于有效 URL 字符但在 URL 其他部分很重要的字符(;?:@&=$+{}<>,)

但是,最后对整个字符串进行纯 URL 百分比转义以确保字符串中的所有字符都是有效的 URL 字符也非常重要。虽然您在示例中没有这样做,但一般来说,字符串的“静态”部分中可能存在不是有效 URL 字符的字符,因此您也需要对这些字符进行转义。

不幸的是,NSString并没有赋予我们转义 RFC3875 重要字符的能力,因此我们必须深入研究CFString才能做到这一点。显然使用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 字符。 p>

要了解为什么以前的解决方案不正确,请想象dreamEntry.text中的用户输入文本包含&,这并非不可能。使用以前的解决方案,当服务器获取该文本时,该字符后面的所有文本都将丢失,因为未转义的 & 符号将被服务器解释为结束该查询字符串对的值部分。

关于iphone - 将 UITextView/UITextField 中的空格编码为 URL 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/917409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com