2012-04-12 31 views
8

Tôi đang sử dụng đoạn mã này để mã hóa ký tự tỏ ra thân thiện với một yêu cầu POST:thoát Quotes trong Objective-C

NSString *unescaped = [textField text]; 
    NSString *escapedString = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
                        NULL, 
                        (__bridge_retained CFStringRef)unescaped, 
                        NULL, 
                        (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
                        kCFStringEncodingUTF8); 

Những tác phẩm tuyệt vời, nhưng không thêm thoát Dấu ngoặc kép: "

Làm cách nào để thoát khỏi các dấu ngoặc kép trong IOS?

Trả lời

15

Tôi nghĩ rằng tôi đã không từ các câu hỏi một cách chính xác.

Tôi cần đưa người dùng nhập NSString từ [textField text] và đảm bảo rằng nếu có dấu ngoặc kép trong chuỗi, chúng được thoát đúng cách để gửi qua tuyên bố POST.

Giải pháp của tôi là:

unescaped = [unescaped stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; 

Cảm ơn

+1

tại sao không sử dụng phương thức lớp" escapedPatternForString: "của NSRegularExpression? – Manoj

0

hãy thử sử dụng \ "thay vì sử dụng" trực tiếp ...

kí tự đặc biệt như Quotes, dấu gạch chéo và những người khác đòi hỏi \ để làm cho rằng nhân vật để loại bỏ chức năng đặc biệt của nó.

1

Báo giá phải được thoát bằng \".

Như trong:

(CFStringRef)@"I'm an \"example\"" 
+0

Tôi biết điều này, tôi muốn bạn biết cách để người dùng nhập vào '" 'và thay đổi thành : '\" ' – Moe

3

Thứ nhất, bạn không muốn sử dụng __bridge_retained trong dàn diễn viên của bạn đến một CFStringRef. Chỉ cần sử dụng __bridge.

Thứ hai, bạn không phải thoát dấu ngoặc kép theo cách thủ công bằng cách thay thế chuỗi. Chỉ cần thêm ký tự trích dẫn vào bộ ký tự được trích dẫn khi gọi CFURLCreateStringByAddingPercentEscapes(). Cũng giống như vậy:.

NSString *unescaped = [textField text]; 
NSString *escapedString = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, 
                        (__bridge CFStringRef)unescaped, 
                        NULL, 
                        CFSTR("!*'();:@&=+$,/?%#[]\""), 
                        kCFStringEncodingUTF8)); 

(Ngoài việc thêm các báo giá để các thiết lập, tôi đã thay đổi để sử dụng CFBridgingRelease() chứ không phải là một diễn viên __bridge_transfer vì tôi thấy nó rõ ràng hơn Nó thỏa mãn cảm giác rằng tất cả các CF "Create" chức năng cần có một Ngoài ra, tôi đã thay đổi cách sử dụng một số @"" chữ thành CFStringRef thành chỉ CFSTR("") chữ.)

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