К сожалению, stringByAddingPercentEscapesUsingEncodingне всегда работает на 100%. Он кодирует не-URL-символы, но оставляет зарезервированные символы (такие как косая черта /и амперсанд &) в одиночку. Очевидно, это ошибка, о которой Apple знает, но поскольку они еще не исправили ее, я использовал эту категорию для URL-кодирования строки:
С какой стати вы будете использовать сложную категорию, подобную этой, а не просто опускаться до CFURLCreateStringByAddingPercentEscapes () , где вы можете явно указать, какие символы вы всегда хотите экранировать.
Лили Баллард
8
@KevinBallard, потому что функция CF работает на инклюзивной модели («экранировать эти символы»), и обычно вы хотите работать с эксклюзивной моделью («экранировать все, кроме этих символов»)
@DaveDeLong Это может быть, где я получил это. Это была стандартная категория во всех моих проектах в течение года или около того, так что я думаю, что вы, возможно, были первоисточником! Я отредактировал формулировку, так что не похоже, что я пытаюсь взять кредит на ее написание).
chown
4
Зачем? if (thisChar == '') {[output appendString: @ "+"]; } Без этого, если он будет кодировать пробелы с% 20, как я и ожидал
Это также неправильно кодирует разделители параметров, такие как «&», «?» в случае, когда вы передаете контент в API.
Бен Лахман
'&' не является допустимым символом для параметра строки запроса URL. Пожалуйста, попробуйте использовать & amp; вместо.
Nishant
1
stringByAddingPercentEscapesUsingEncoding is DEPRECATED "Использовать -stringByAddingPercentEncodingWithAllowedCharacters:вместо этого, который всегда использует рекомендованную кодировку UTF-8 и который кодирует для конкретного компонента или подкомпонента URL, поскольку каждый компонент или подкомпонент URL имеет разные правила для допустимых символов."
Михир Оза
89
Новые API были добавлены с момента выбора ответа; Теперь вы можете использовать NSURLUtilities. Поскольку разные части URL допускают разные символы, используйте соответствующий набор символов. В следующем примере кодируется для включения в строку запроса:
Мне потребовалось некоторое время, чтобы понять, что вы имели в виду под «использовать NSURLUtilities» - но теперь я вижу, что это название категории NSString, в которой Apple определила этот новый метод в iOS 7 и OS X 10.9.
Ага. Он также был указан как NSURLUtilities в списке новых выпущенных API.
Питер ДеВиз
'&', конечно, разрешено в строке запроса, поэтому я отредактирую свой ответ, используя ссылку Ричарда.
Питер ДеВиз
3
NSMakeRange('&', 1)не работает в Swift, потому что Swift не позволяет конвертировать char в int без взлома. Чтобы использовать это решение в коде Swift, используйте removeCharactersInString("&")вместо.removeCharactersInRange(...)
cbh2000
16
Пример Swift 2.0 (совместимо с iOS 9)
extension String{
func stringByURLEncoding()->String?{
let characters =NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as!NSMutableCharacterSet
characters.removeCharactersInString("&")
guard let encodedString = self.stringByAddingPercentEncodingWithAllowedCharacters(characters)else{return nil
}return encodedString
}}
На самом деле это зависит от вашего сервера для допустимых символов, здесь на моем примере на сервере, который я использовал, он разрешал только буквенно-цифровой набор символов, вы можете изменить его на конкретные символы для удовлетворения ваших потребностей.
Underdog
1
Вопрос задает вопрос о кодировке символа «&».
Стив Мозер
8
Я решил использовать CFURLCreateStringByAddingPercentEscapesвызов в соответствии с принятым ответом, однако в новейшей версии XCode (и IOS) это привело к ошибке, поэтому вместо этого использовал следующее:
Это не пространство кодирования. Пример @ "string string" и @ "string & string" закодирован правильно. Пожалуйста, дайте мне знать ваш вклад в том же.
Йогеш Лолусаре
2
для меня большую часть времени, потраченного на решение этой проблемы, было периодом отказа, когда я отказывался верить, что среда не содержит чего-то похожего на 'urlencode', что делает это без
возни
6
Попробуй использовать stringByAddingPercentEncodingWithAllowedCharacters метод с [NSCharacterSet URLUserAllowedCharacterSet]ним охватит все случаи
Цель С
NSString*value =@"Test / Test";
value =[value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSetURLUserAllowedCharacterSet]];
быстрый
var value ="Test / Test"
value.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLUserAllowedCharacterSet())
Прочитав все ответы на эту тему и ( неправильный ) принятый, я хочу добавить свой вклад.
ЕСЛИ целью является iOS7 +, и в 2017 году это должно произойти, так как XCode делает действительно трудным обеспечение совместимости под iOS8, лучший способ, многопоточный, быстрый, amd будет полностью поддерживать UTF-8, чтобы сделать это:
(Объективный код C)
@implementationNSString(NSString_urlencoding)-(NSString*)urlencode {staticNSMutableCharacterSet*chars = nil;staticdispatch_once_t pred;if(chars)return[self stringByAddingPercentEncodingWithAllowedCharacters:chars];// to be thread safe
dispatch_once(&pred,^{
chars =NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;[chars removeCharactersInString:@"!*'();:@&=+$,/?%#[]"];});return[self stringByAddingPercentEncodingWithAllowedCharacters:chars];}@end
Это расширит NSString, исключит запрещенные символы RFC, поддержит символы UTF-8 и позволит вам использовать такие вещи, как:
let stringURL ="YOUR URL TO BE ENCODE";
let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)
print(encodedURLString)
Так как stringByAddingPercentEscapesUsingEncodingкодирует не URL-символы, но оставляет зарезервированные символы (например !*'();:@&=+$,/?%#[]), вы можете кодировать URL-адрес, как показано ниже:
let stringURL ="YOUR URL TO BE ENCODE";
let characterSetTobeAllowed =(CharacterSet(charactersIn:"!*'();:@&=+$,/?%#[] ").inverted)if let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters: characterSetTobeAllowed){
print(encodedURLString)}
Если вам нужно процентное кодирование всей строки URL, вы можете использовать этот код для кодирования строки NSString, предназначенной для URL (в urlStringToEncode):
кажется, не работает, символы как & все еще остаются одни
kjyv
1
В моем случае, когда последний компонент был арабскими буквами, я сделал следующее Swift 2.2:
extension String{
func encodeUTF8()->String?{//If I can create an NSURL out of the string nothing is wrong with itif let _ = NSURL(string: self){return self
}//Get the last component from the string this will return subSequence
let optionalLastComponent = self.characters.split { $0 =="/"}.last
if let lastComponent = optionalLastComponent {//Get the string from the sub sequence by mapping the characters to [String] then reduce the array to String
let lastComponentAsString = lastComponent.map{String($0)}.reduce("", combine:+)//Get the range of the last componentif let rangeOfLastComponent = self.rangeOfString(lastComponentAsString){//Get the string without its last component
let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)//Encode the last componentif let lastComponentEncoded = lastComponentAsString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()){//Finally append the original string (without its last component) to the encoded part (encoded last component)
let encodedString = stringWithoutLastComponent + lastComponentEncoded
//Return the string (original string/encoded string)return encodedString
}}}return nil;}}
использование:
let stringURL ="http://xxx.dev.com/endpoint/nonLatinCharacters"if let encodedStringURL = stringURL.encodeUTF8(){if let url = NSURL(string: encodedStringURL){...}}
Но это не рекомендуется в iOS 9. Какой обновленный код для этого?
Суджит Начан
1
Так много ответов, но у меня не получилось, поэтому я попробовал следующее:
fun simpleServiceCall(for serviceUrl:String, appendToUrl:String){
let urlString:String= serviceUrl + appendToUrl.addingPercentEncoding(withAllowedCharacters:.urlPathAllowed)!
let finalUrl = URL(string: urlString)!//continue to execute your service call... }
Я столкнулся с аналогичной проблемой передачи сложных строк в качестве параметра POST. Мои строки могут содержать азиатские символы, пробелы, кавычки и всевозможные специальные символы. Решение, которое я в итоге нашел, состояло в том, чтобы преобразовать мою строку в совпадающую последовательность юникодов, например «Hu0040Hu0020Hu03f5 ....», используя [NSString stringWithFormat: @ "Hu% 04x", [string characterAtIndex: i]], чтобы получать Unicode из каждого символ в исходной строке. То же самое можно сделать в Java.
Эта строка может быть безопасно передана в качестве параметра POST.
На стороне сервера (PHP) я меняю все буквы "H" на "\" и передаю полученную строку в json_decode. Последний шаг - экранирование одинарных кавычек перед сохранением строки в MySQL.
Таким образом, я могу сохранить любую строку UTF8 на моем сервере.
Ответы:
К сожалению,
stringByAddingPercentEscapesUsingEncoding
не всегда работает на 100%. Он кодирует не-URL-символы, но оставляет зарезервированные символы (такие как косая черта/
и амперсанд&
) в одиночку. Очевидно, это ошибка, о которой Apple знает, но поскольку они еще не исправили ее, я использовал эту категорию для URL-кодирования строки:Используется так:
Это также работает:
Некоторое хорошее чтение о предмете:
Objective-c iPhone проц кодирует строку?
Кодировка URL Objective-C и Swift
http://cybersam.com/programming/proper-url-percent-encoding-in-ios
https://devforums.apple.com/message/15674#15674 http://simonwoodside.com/weblog/2009/4/ 22 / how_to_really_url_encode /
источник
Это может быть полезно
Для iOS 7+ рекомендуемый способ:
Вы можете выбрать разрешенный набор символов в соответствии с требованием компонента URL.
источник
-stringByAddingPercentEncodingWithAllowedCharacters:
вместо этого, который всегда использует рекомендованную кодировку UTF-8 и который кодирует для конкретного компонента или подкомпонента URL, поскольку каждый компонент или подкомпонент URL имеет разные правила для допустимых символов."Новые API были добавлены с момента выбора ответа; Теперь вы можете использовать NSURLUtilities. Поскольку разные части URL допускают разные символы, используйте соответствующий набор символов. В следующем примере кодируется для включения в строку запроса:
Чтобы специально преобразовать '&', вам нужно удалить его из набора URL-запросов или использовать другой набор, так как '&' разрешено в URL-запросе:
источник
NSMakeRange('&', 1)
не работает в Swift, потому что Swift не позволяет конвертировать char в int без взлома. Чтобы использовать это решение в коде Swift, используйтеremoveCharactersInString("&")
вместо.removeCharactersInRange(...)
Пример Swift 2.0 (совместимо с iOS 9)
источник
обновление ios 7
источник
Я решил использовать
CFURLCreateStringByAddingPercentEscapes
вызов в соответствии с принятым ответом, однако в новейшей версии XCode (и IOS) это привело к ошибке, поэтому вместо этого использовал следующее:источник
Попробуй использовать
stringByAddingPercentEncodingWithAllowedCharacters
метод с[NSCharacterSet URLUserAllowedCharacterSet]
ним охватит все случаиЦель С
быстрый
Вывод
Test%20%2F%20Test
источник
Прочитав все ответы на эту тему и ( неправильный ) принятый, я хочу добавить свой вклад.
ЕСЛИ целью является iOS7 +, и в 2017 году это должно произойти, так как XCode делает действительно трудным обеспечение совместимости под iOS8, лучший способ, многопоточный, быстрый, amd будет полностью поддерживать UTF-8, чтобы сделать это:
(Объективный код C)
Это расширит NSString, исключит запрещенные символы RFC, поддержит символы UTF-8 и позволит вам использовать такие вещи, как:
Это напечатает на вашей консоли отладки:
... обратите внимание также на использование dispatch_once, чтобы избежать множественных инициализаций в многопоточных средах.
источник
Вот готовый к работе гибкий подход в Swift 5.x :
Пример использования:
Вывод:
источник
Используйте NSURLComponents для кодирования параметров HTTP GET:
http://www.ralfebert.de/snippets/ios/encoding-nsurl-get-parameters/
источник
Этот код помог мне для кодирования специальных символов
источник
быстрый код, основанный на ответе chown 's objc в этой теме.
источник
В Swift 3 , пожалуйста, попробуйте ниже:
Так как
stringByAddingPercentEscapesUsingEncoding
кодирует не URL-символы, но оставляет зарезервированные символы (например!*'();:@&=+$,/?%#[]
), вы можете кодировать URL-адрес, как показано ниже:источник
В быстром 3:
источник
Совет Apple в примечаниях к выпуску 10.11:
Если вам нужно процентное кодирование всей строки URL, вы можете использовать этот код для кодирования строки NSString, предназначенной для URL (в urlStringToEncode):
источник
В моем случае, когда последний компонент был арабскими буквами, я сделал следующее
Swift 2.2
:использование:
источник
в соответствии со следующим блогом
источник
Так много ответов, но у меня не получилось, поэтому я попробовал следующее:
Надеюсь, это кому-нибудь поможет. Спасибо
источник
Для отдельных параметров запроса в кодировке www я создал категорию на NSString:
источник
// Это без теста
источник
Я столкнулся с аналогичной проблемой передачи сложных строк в качестве параметра POST. Мои строки могут содержать азиатские символы, пробелы, кавычки и всевозможные специальные символы. Решение, которое я в итоге нашел, состояло в том, чтобы преобразовать мою строку в совпадающую последовательность юникодов, например «Hu0040Hu0020Hu03f5 ....», используя [NSString stringWithFormat: @ "Hu% 04x", [string characterAtIndex: i]], чтобы получать Unicode из каждого символ в исходной строке. То же самое можно сделать в Java.
Эта строка может быть безопасно передана в качестве параметра POST.
На стороне сервера (PHP) я меняю все буквы "H" на "\" и передаю полученную строку в json_decode. Последний шаг - экранирование одинарных кавычек перед сохранением строки в MySQL.
Таким образом, я могу сохранить любую строку UTF8 на моем сервере.
источник
Этот работает на меня.
Я нашел вышеуказанную функцию по этой ссылке: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/
Вы также можете использовать эту функцию с быстрым расширением. Пожалуйста, дайте мне знать, если есть какие-либо проблемы.
источник