2010-04-07 20 views
12

Tôi đang cố gắng mã hóa URL một chuỗi để tạo yêu cầu GET từ mục tiêu-c.URLKích hoạt một chuỗi với Objective-C

NSString *params = @"'Decoded data!'/foo.bar:baz"; 

NSRunAlertPanel(@"Error", [params urlEncoded], @"OK", nil, nil); 

Đây là loại mở rộng NSString

-(NSString *) urlEncoded 
{ 
    NSString *encoded = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                NULL, 
                (CFStringRef)self, 
                NULL, 
                (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                kCFStringEncodingUTF8); 
    return encoded; 
} 

Vì vậy, lần đầu tiên tôi chạy nó tôi nhận được lại

1606410046ecoded   1606410784ata2270.000000foo.bar0X1.001716P-1042baz 

từ hộp thoại.

Ngay sau khi tôi chạy nó một lần nữa tôi có được điều này

1606410046ecoded   1606410944ata227369374562920703448982951250259562309742470533728899744288431318481119278377104028261651081181287077973859930826299575521579020410425419424562236383226511593137467590082636817579938932512039895040.000000foo.bar0X1.66E6156303225P+771baz 

Sau đó, nếu tôi chạy nó một lần nữa nó đi lại cho người đầu tiên. Nó thực sự kỳ lạ.

Nếu thông số được đặt thành @ "&" hoặc @ "" Tôi chỉ lấy lại "2" (w/o dấu ngoặc kép) trong hộp thoại.

Ngoài ra, có cách nào tôi có thể hiển thị dấu% trong hộp thoại cảnh báo không?

Cảm ơn

+1

Tại sao các bạn gọi đó là hai lần và tại sao bạn không đăng nhập đầu ra của bạn thay vì đẩy nó vào một cảnh báo? –

Trả lời

23

Tôi nghĩ rằng NSAlert được giải thích các nhân vật % như specifiers định dạng chuỗi đang được lấp đầy với dữ liệu ngẫu nhiên. Chỉ cần NSLog đầu ra và nó là tốt:

%27Decoded%20data%21%27%2Ffoo.bar%3Abaz 

Ngoài ra, bạn có một rò rỉ bộ nhớ trong phương pháp -urlEncoded loại của bạn. Bạn tạo chuỗi bằng cách sử dụng hàm CF có chứa Create để bạn có trách nhiệm phát hành nó.

-(NSString *) urlEncoded 
{ 
    CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
                NULL, 
                (CFStringRef)self, 
                NULL, 
                (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                kCFStringEncodingUTF8); 
    return [(NSString *)urlString autorelease]; 
} 
+0

Cảm ơn bạn đã cảnh báo rò rỉ bộ nhớ. Trên thực tế vấn đề vẫn tồn tại với NSLog. Tôi đã sửa nó bằng cách thay thế% bằng %% trong chuỗi chi tiết trong câu trả lời của tôi bên dưới. – Chris

+3

Điều đó có nghĩa là bạn có thể đang sử dụng 'NSLog' như thế này:' NSLog (được mã hóa) '. Đối số đầu tiên cho 'NSLog' là một chuỗi định dạng, không phải là một chuỗi đơn giản. Bất kỳ trình giữ chỗ định dạng chuỗi nào sẽ được thay thế bằng các đối số theo sau, trong trường hợp đó là không xác định. Bạn phải đăng nhập chuỗi như sau: 'NSLog (@"% @ ", được mã hóa);'. –

+1

Sử dụng 'tự động trả lại [NSMakeCollectable (urlString)]' cũng làm cho nó trở thành GC-clean và tránh việc truyền. –

1

OK hóa ra là không phát hành. Nó đã được mã hóa chính xác bởi vì tôi đã kiểm tra nhật ký máy chủ và có vẻ như các tham số yêu cầu được mã hóa.

Và để hiển thị chuỗi được mã hóa trong hộp thoại chính xác, tôi chỉ thay thế tất cả các phiên bản của% bằng %% sau khi thực tế.

6

Tôi đã mở nguồn gốc lớp tiện ích mã hóa URL của mình, bỏ qua phần tên miền và đường dẫn của URL một cách thông minh (để tránh mã hóa dấu gạch chéo, v.v.) và chỉ thoát khỏi các phần trăm không theo sau 2- chữ số hex mã (để ngăn chặn mã hóa kép của phần trăm như thế này:% 20 ->% 2520).

Nó đã được thử nghiệm với hơn 10.000 URL và rất mạnh mẽ và hiệu quả.

Bạn có thể tìm hiểu thêm về (và tải xuống) triển khai của tôi tại đây ... http://jayfuerstenberg.com/devblog/url-encoding-in-objective-c

2

Thay vì autorelease, đó là không còn có sẵn khi sử dụng ARC, tạo phương pháp dụ của bạn bằng cách thông qua một chuỗi và sử dụng CFBridgingRelease:

- (NSString *)urlEncodeWithString: (NSString*)string 
{ 
    CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
                    NULL, 
                    (CFStringRef)string, 
                    NULL, 
                    (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                    kCFStringEncodingUTF8); 
    return (NSString *)CFBridgingRelease(urlString); 
} 
0

Theo tôi cách đơn giản nhất là sử dụng phương pháp thuận tiện cung cấp với NSString (NSURLUtilities) loại

thực hiện của tôi:

- (NSString *) urlEncodedString 
{ 
    NSString *result = [self stringByReplacingOccurrencesOfString:@" " withString:@"+"]; 
    result = [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    return result; 
} 
+0

Không hoạt động. Dịch "Đây là câu lệnh của tôi + OK." thành "+ Đây là + tuyên bố của tôi + + + Có + nó?" thay vì câu lệnh "This + is + my +% 2B +. + Got + it% 3F". – Volomike

Các vấn đề liên quan