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

Max*_* Z. 7 xml post encoding objective-c

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

page.php?text=Hello World & Space.
Run Code Online (Sandbox Code Playgroud)

现在我发现服务器收到了"&",但读起来好像是一个新的变量.所以它看到(我认为):

text = "Hello World "
Space. =
Run Code Online (Sandbox Code Playgroud)

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

textToPOST = [text stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
Run Code Online (Sandbox Code Playgroud)

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

some text ü blablabla
Run Code Online (Sandbox Code Playgroud)

变成

some%20text%20ü%20blablabla
Run Code Online (Sandbox Code Playgroud)

与&未编码.那我怎么能这样做,请帮忙.

非常感谢

bob*_*nce 6

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

(在JavaScript方面,它是类似于encodeURI而不是一个需要远远更多的时候是encodeURIComponent).

所以为了正确地做到这一点,你需要另外一种方法,无论是你自己的方法还是现有的框架(这是一个非常常见的痛点,所以很多图书馆都有解决方法).可以实现使用CFURLCreateStringByAddingPercentEscapes.请参阅此答案以获取示例代码.


Max*_* Z. 1

感谢您的回答,并对我的过早发帖表示歉意:SI 希望它至少可以帮助任何与我有相同问题的人。刚刚和一个朋友聊天,他告诉我:

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

  • ü [文本] -> uml; [在 HTML 中] -> ü [XML 格式]
  • ä [在文本中] -> Ä [在 HTML 中] -> Ä [XML 格式]
  • ß [在文本中] -> ß [在 HTML 中] -> ß [XML 格式]
  • ETC...

这就是解决“如何使用放大器解析 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])];
Run Code Online (Sandbox Code Playgroud)

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

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

NSMutableString *englishEscaped = [NSMutableString stringWithString:[[englishTextLabel string] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
Run Code Online (Sandbox Code Playgroud)

谢谢你们 :)