Uwaga: -stringByAddingPercentEscapesUsingEncodingnie wygeneruje prawidłowego kodowania, w tym przypadku nie zakoduje niczego zwracającego ten sam ciąg.
Zauważ również, że możesz użyć -stringByAddingPercentEscapesUsingEncodingmetody NSString .
Mike Weller
2
Ach tak, teraz pamiętam dziwne stringByAddingPercentEscapesUsingEncodingzachowanie. Koduje tylko „&” i „=” lub coś takiego niedorzecznego.
Mike Weller
2
Zgodnie z RFC1738 musiałbyś również zakodować dodatkowe znaki. Więc chociaż to odpowiada na pytanie OP, ma ograniczoną użyteczność jako koder URL ogólnego przeznaczenia. Na przykład nie obsługuje znaków innych niż alfanumeryczne, takich jak niemiecki umlaut.
Alex Nauda,
3
To nie działa (dla części iOS 7). To nie konwertuje & na% 26.
coolcool1994
1
Utwórz zestaw znaków, którego potrzebujesz z NSStringwith characterSetWithCharactersInString, weź odwrotność z invertedSeti użyj tego z stringByAddingPercentEncodingWithAllowedCharacters. Na przykład zobacz tę odpowiedź SO .
Gdyby ktoś mi powiedział, kto napisał ten kod, będę bardzo wdzięczny. Zasadniczo ma pewne wyjaśnienie, dlaczego ten zakodowany ciąg będzie dekodował dokładnie tak, jak sobie życzy.
Zmodyfikowałem trochę jego rozwiązanie. Wolę, aby przestrzeń była reprezentowana za pomocą% 20 zamiast +. To wszystko.
@yuchaozh to jest funkcja, którą umieszczasz w kategorii NSString. Tak więc self to NSStirng i [self UTF8String] zwraca, zakładając, swój ciąg w formacie UTF8.
release encodedString i url. ten kod dotyczy parametru kodowania. Aby zakodować cały ciąg adresu zamiast „parametru”.
Zahi
To zadziałało dla mnie ... zakodował nawet znak &, z którym miałem problemy.
Виктор Иванов
3
Może to działać w ARC Objective C. Użyj CFBridgingRelease, aby rzutować obiekt w stylu Core Foundation jako obiekt Objective-C i przenieść własność obiektu na ARC .Patrz Funkcja CFBridgingRelease tutaj.
Oto czego używam. Pamiętaj, że musisz użyć@autoreleasepool funkcji lub program może zawiesić lub zablokować IDE. Musiałem trzykrotnie zrestartować IDE, zanim zdałem sobie sprawę z poprawki. Wygląda na to, że ten kod jest zgodny z ARC.
To pytanie było zadawane wiele razy i udzielono wielu odpowiedzi, ale niestety wszystkie wybrane (i kilka innych sugerowanych) są błędne.
Oto ciąg testowy, którego użyłem: This is my 123+ test & test2. Got it?!
Google implementuje to w swoim programie Google Toolbox dla komputerów Mac . To dobre miejsce, aby zobaczyć, jak to robią. Inną opcją jest dołączenie Toolbox i użycie ich implementacji.
Sprawdź implementację tutaj . (Co sprowadza się dokładnie do tego, co ludzie tutaj publikowali).
ùÕ9y^VêÏÊEØ®.ú/V÷ÅÖêú2Èh~
- żadne z poniższych rozwiązań nie wydaje się rozwiązać tego problemu!Odpowiedzi:
Ucieczka przed postaciami, które chcesz, to trochę więcej pracy.
Przykładowy kod
Wyjście NSLog:
Poniżej przedstawiono przydatne zestawy znaków do kodowania adresów URL:
Tworzenie zestawu znaków łączącego wszystkie powyższe:
Tworzenie Base64
W przypadku zestawu znaków Base64:
Uwaga:
stringByAddingPercentEncodingWithAllowedCharacters
zakoduje również znaki UTF-8 wymagające kodowania.Korzystanie z Core Foundation bez ARC:
Uwaga:
-stringByAddingPercentEscapesUsingEncoding
nie wygeneruje prawidłowego kodowania, w tym przypadku nie zakoduje niczego zwracającego ten sam ciąg.stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding
koduje 14 znaków:testString:
encodedString:
Uwaga: zastanów się, czy ten zestaw znaków spełnia Twoje potrzeby, jeśli nie, zmień je w razie potrzeby.
Znaki RFC 3986 wymagające kodowania (% dodane, ponieważ jest to znak prefiksu kodowania):
Niektóre „niezarezerwowane znaki” są dodatkowo zakodowane:
źródło
-stringByAddingPercentEscapesUsingEncoding
metody NSString .stringByAddingPercentEscapesUsingEncoding
zachowanie. Koduje tylko „&” i „=” lub coś takiego niedorzecznego.NSString
withcharacterSetWithCharactersInString
, weź odwrotność zinvertedSet
i użyj tego zstringByAddingPercentEncodingWithAllowedCharacters
. Na przykład zobacz tę odpowiedź SO .Nazywa się to kodowaniem adresów URL . Więcej tutaj .
źródło
CFURLCreateStringByAddingPercentEscapes()
jest przestarzałe. Użyj[NSString stringByAddingPercentEncodingWithAllowedCharacters:]
zamiast tego.To nie jest moje rozwiązanie. Ktoś inny napisał w stackoverflow, ale zapomniałem jak.
Jakoś to rozwiązanie działa „dobrze”. Obsługuje znaki diakrytyczne, chińskie i prawie wszystko inne.
Gdyby ktoś mi powiedział, kto napisał ten kod, będę bardzo wdzięczny. Zasadniczo ma pewne wyjaśnienie, dlaczego ten zakodowany ciąg będzie dekodował dokładnie tak, jak sobie życzy.
Zmodyfikowałem trochę jego rozwiązanie. Wolę, aby przestrzeń była reprezentowana za pomocą% 20 zamiast +. To wszystko.
źródło
źródło
Może to działać w ARC Objective C. Użyj CFBridgingRelease, aby rzutować obiekt w stylu Core Foundation jako obiekt Objective-C i przenieść własność obiektu na ARC .Patrz Funkcja CFBridgingRelease tutaj.
źródło
Swift iOS:
Tylko dla informacji: użyłem tego:
źródło
Będziesz musiał zwolnić lub automatycznie
str
się zwolnić .źródło
Oto czego używam. Pamiętaj, że musisz użyć
@autoreleasepool
funkcji lub program może zawiesić lub zablokować IDE. Musiałem trzykrotnie zrestartować IDE, zanim zdałem sobie sprawę z poprawki. Wygląda na to, że ten kod jest zgodny z ARC.To pytanie było zadawane wiele razy i udzielono wielu odpowiedzi, ale niestety wszystkie wybrane (i kilka innych sugerowanych) są błędne.
Oto ciąg testowy, którego użyłem:
This is my 123+ test & test2. Got it?!
Oto moje metody klasy Objective C ++:
źródło
Google implementuje to w swoim programie Google Toolbox dla komputerów Mac . To dobre miejsce, aby zobaczyć, jak to robią. Inną opcją jest dołączenie Toolbox i użycie ich implementacji.
Sprawdź implementację tutaj . (Co sprowadza się dokładnie do tego, co ludzie tutaj publikowali).
źródło
Oto jak robię to szybko.
źródło
// użyj metody instancji NSString w następujący sposób:
pamiętaj, że powinieneś kodować lub dekodować tylko wartość parametru, a nie cały adres URL, o który prosisz.
źródło
źródło