使用带有Obj-C的帖子发送放大器(&)

时间:2011-07-31 10:12:54

标签: objective-c xml post encoding

我发送的帖子包含文字,数字和数据。数字和数据工作正常,但我的文本有问题,因为它可能包含&符号(&)。例如

page.php?text=Hello World & Space.

现在我发现了“&”由服务器接收,但读取就像新变量开始一样。所以它看到了(我认为):

text = "Hello World "
Space. =

我确实读过我可以尝试对文本进行编码,使其看起来像是一个URL(例如“”[space]变成“%20”)但是没有办法正确编码。我得出结论:

textToPOST = [text stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

但这不会编码&符号,而是其他所有内容。结果是:

some text ü blablabla

变成

some%20text%20ü%20blablabla

与&没有编码。那我怎么能这样做,请帮忙。

非常感谢

2 个答案:

答案 0 :(得分:6)

不幸的是stringByAddingPercentEscapesUsingEncoding不是网址编码,因为大多数人都理解它。它会转义在URL中完全无效的字符,但不包含URL中具有特殊含义的字符。因此,它可用于“纠正”无效的用户输入的URL,但它非常不适合从转义路径和查询字符串组件创建URL。

(在JavaScript术语中,它类似于encodeURI而不是您需要的更常见的是encodeURIComponent。)

因此,要正确地执行此操作,您将需要另一种方法,无论是您自己的方法还是现有框架中的捏合(这是一个非常常见的痛点,因此很多库都有解决方法)。可以使用CFURLCreateStringByAddingPercentEscapes来实现。有关示例代码,请参阅this answer

答案 1 :(得分:1)

感谢您的回答并抱歉我的过早发帖:我希望它至少可以帮助那些遇到与我相同问题的人。我刚和朋友聊天,他告诉我:

  

要在XML中显示和&符号,只需使用& amp; amp;引用。与纯“&”不同,NSXMLParser不会输出错误。使用& amp;还允许您进行其他符号转义,如:

     
  • ü[in text] - > &安培; uuml; [在HTML中] - > &放大器;放大器; uuml; [在XML中]
  • Ä[in text] - > &安培; AUML; [在HTML中] - > &放大器;放大器; AUML; [在XML中]
  • ß[in text] - > &安培;大街[在HTML中] - > &放大器;放大器;大街[在XML中]
  • 等......

这就是你如何解决“如何用放大器解析XML问题”。此外,我设法制作代码,从我在评论中链接的网站到我原来的问题,工作:

NSMutableString *deutschEscaped = [NSMutableString stringWithString:[[deutschTextLabel string] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[deutschEscaped replaceOccurrencesOfString:@"$" withString:@"%24" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"," withString:@"%2C" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@";" withString:@"%3B" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"=" withString:@"%3D" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"?" withString:@"%3F" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"@" withString:@"%40" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@" " withString:@"%20" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"\t" withString:@"%09" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"#" withString:@"%23" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"<" withString:@"%3C" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@">" withString:@"%3E" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"\"" withString:@"%22" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];
[deutschEscaped replaceOccurrencesOfString:@"\n" withString:@"%0A" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [deutschEscaped length])];

这对我来说很好,并且确实取代了&符号以及任何其他可能的危险。

如果您不希望每个空间都有多个%20转义符,您还可以使用:

NSMutableString *englishEscaped = [NSMutableString stringWithString:[[englishTextLabel string] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

谢谢大家:)