Как мне URL кодировать строку - PullRequest
186 голосов
/ 11 ноября 2011

У меня есть строка URL (NSString) с пробелами и & символами.Как мне URL кодировать всю строку (включая символ & амперсанда и пробелы)?

Ответы [ 21 ]

4 голосов
/ 21 апреля 2017

Этот код помог мне для кодирования специальных символов

NSString* encPassword = [password stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
3 голосов
/ 10 января 2015

swift код, основанный на ответе chown в этой теме.

extension String {
    func urlEncode() -> String {
        return CFURLCreateStringByAddingPercentEscapes(
            nil,
            self,
            nil,
            "!*'();:@&=+$,/?%#[]",
            CFStringBuiltInEncodings.UTF8.rawValue
        )
    }
}
2 голосов
/ 26 сентября 2017

Совет Apple в примечаниях к выпуску 10.11:

Если вам нужно процентное кодирование всей строки URL-адреса, вы можете использовать этот код для кодирования строки NSString, предназначенной для URL-адреса (в urlStringToEncode):

NSString *percentEncodedURLString =
  [[NSURL URLWithDataRepresentation:[urlStringToEncode dataUsingEncoding:NSUTF8StringEncoding] relativeToURL:nil] relativeString];
2 голосов
/ 30 декабря 2016

В быстром 3:

// exclude alpha and numeric == "full" encoding
stringUrl = stringUrl.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!;

// exclude hostname and symbols &,/ and etc
stringUrl = stringUrl.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!;
2 голосов
/ 19 октября 2016

В Swift 3 , попробуйте ниже:

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)
}
1 голос
/ 03 февраля 2016
-(NSString *)encodeUrlString:(NSString *)string {
  return CFBridgingRelease(
                    CFURLCreateStringByAddingPercentEscapes(
                        kCFAllocatorDefault,
                        (__bridge CFStringRef)string,
                        NULL,
                        CFSTR("!*'();:@&=+$,/?%#[]"),
                        kCFStringEncodingUTF8)
                    );
}

согласно следующему блогу

1 голос
/ 21 марта 2016

В моем случае, когда последним компонентом были арабские буквы, я сделал следующее в Swift 2.2:

extension String {

 func encodeUTF8() -> String? {

    //If I can create an NSURL out of the string nothing is wrong with it
    if 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 component
        if let rangeOfLastComponent = self.rangeOfString(lastComponentAsString) {
            //Get the string without its last component
            let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)


            //Encode the last component
            if 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) {

      ...
    }

} 
0 голосов
/ 26 ноября 2015

Я столкнулся с аналогичной проблемой передачи сложных строк в качестве параметра POST. Мои строки могут содержать азиатские символы, пробелы, кавычки и всевозможные специальные символы. Решение, которое я в конце концов нашел, состояло в том, чтобы преобразовать мою строку в соответствующую серию юникодов, например "Hu0040Hu0020Hu03f5 ....", используя [NSString stringWithFormat: @ "Hu% 04x", [string characterAtIndex: i]], чтобы получить Unicode от каждого символа в исходной строке. То же самое можно сделать в Java.

Эта строка может быть безопасно передана в качестве параметра POST.

На стороне сервера (PHP) я меняю все буквы "H" на "\" и передаю полученную строку в json_decode. Последний шаг - экранирование одинарных кавычек перед сохранением строки в MySQL.

Таким образом, я могу сохранить любую строку UTF8 на моем сервере.

0 голосов
/ 18 апреля 2015

Для отдельных параметров запроса в кодировке www я создал категорию на NSString:

- (NSString*)WWWFormEncoded{
     NSMutableCharacterSet *chars = NSCharacterSet.alphanumericCharacterSet.mutableCopy;
     [chars addCharactersInString:@" "];
     NSString* encodedString = [self stringByAddingPercentEncodingWithAllowedCharacters:chars];
     encodedString = [encodedString stringByReplacingOccurrencesOfString:@" " withString:@"+"];
     return encodedString;
}
0 голосов
/ 06 мая 2015

// Это без теста

NSMutableCharacterSet* set = [[NSCharacterSet alphanumericCharacterSet] mutableCopy];
[set addCharactersInString:@"-_.~"];
NSString *encode = [test stringByAddingPercentEncodingWithAllowedCharacters:set];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...