我发送的帖子包含文字,数字和数据。数字和数据工作正常,但我的文本有问题,因为它可能包含&符号(&)。例如
page.php?text=Hello World & Space.
现在我发现了“&”由服务器接收,但读取就像新变量开始一样。所以它看到了(我认为):
text = "Hello World "
Space. =
我确实读过我可以尝试对文本进行编码,使其看起来像是一个URL(例如“”[space]变成“%20”)但是没有办法正确编码。我得出结论:
textToPOST = [text stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
但这不会编码&符号,而是其他所有内容。结果是:
some text ü blablabla
变成
some%20text%20ü%20blablabla
与&没有编码。那我怎么能这样做,请帮忙。
非常感谢
答案 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]];
谢谢大家:)