Отправка усилителя (&) с помощью сообщения с помощью Obj-C - PullRequest
7 голосов
/ 31 июля 2011

Я отправляю сообщение, содержащее текст, цифры и данные. Числа и данные работают нормально, но у меня проблемы с текстом, поскольку он может содержать амперсанд (&). Например

page.php?text=Hello World & Space.

Теперь я обнаружил, что "&" получено сервером, но читается так, как будто начинается новая переменная. Так что он видит (я думаю):

text = "Hello World "
Space. =

Я читал, что могу попытаться закодировать текст, чтобы он выглядел так, как будто это URL (например, "" [пробел] превращается в "% 20"), но нет способа правильно его закодировать. Я пришел к выводу:

textToPOST = [text stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

Но это не кодирует амперсанды, а все остальное. Итак, результат:

some text ü blablabla

превращается в

some%20text%20ü%20blablabla

с & не закодировано. Так как я могу это сделать, пожалуйста, помогите.

Большое спасибо уже

Ответы [ 2 ]

6 голосов
/ 31 июля 2011

К сожалению stringByAddingPercentEscapesUsingEncoding не является кодировкой URL, как это понимают большинство людей. Он экранирует символы, которые абсолютно недопустимы в URL, но не символы, имеющие особое значение в URL. Таким образом, его можно использовать для «исправления» неверного введенного пользователем URL-адреса, но он совершенно не подходит для создания URL-адреса из экранированных путей и компонентов строки запроса.

(В терминах JavaScript это аналог encodeURI, а не тот, который вам нужен далеко чаще, что encodeURIComponent.)

Таким образом, чтобы сделать это правильно, вам понадобится другой метод, либо ваш собственный, либо урезанный из существующего фреймворка (это очень распространенный больной вопрос, поэтому во многих библиотеках есть обходные пути). Возможно реализовать используя CFURLCreateStringByAddingPercentEscapes. См. этот ответ , например, код.

1 голос
/ 01 августа 2011

Спасибо за этот ответ и извините за преждевременную публикацию: я надеюсь, что это поможет любому, у кого такая же проблема, как у меня.Я только что поболтал с другом, и он сказал мне:

Для отображения и амперсанда в XML просто используйте & quote.В отличие от чистого «&», NSXMLParser не выдаст ошибку.Использование & также позволяет вам сделать экранирование других символов, таких как:

  • ü [в тексте] -> ü [в HTML] -> & uuml;[в XML]
  • Ä [в тексте] -> Ä [в HTML] -> & Auml;[в XML]
  • ß [в тексте] -> ß [в HTML] -> & szlig;[в 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]];

Спасибо всем:)

...