2011-02-06 44 views
19

Tôi cố gắng để phân tích một thức ăn từ một webservice json trên iPhone của tôi tuy nhiên việc chuyển đổi utf8 không hoạt động theo cách nó phải hay tôi làm điều gì sai Đây là ngoài của thức ăn
est un r\u00c3\u00aave en noirUTF8 nhân vật giải mã trong Objective C

Đây là mã tôi đã viết để chuyển đổi trên:

NSString* str1 = @"est un r \u00c3\u00aa ve en noir"; 

NSString* str = [NSString stringWithUTF8String:[str1 cStringUsingEncoding:NSUTF8StringEncoding]]; 
NSLog(@"Converted UTF %@",str); 

Đây là sản phẩm mà tôi đang nhận được:
Converted UTF est un r ê ve en noir

Sản lượng dự kiến ​​nên
Converted UTF est un rêve en noir

Khi tôi kiểm tra bảng UTF và sử dụng một bộ chuyển đổi utf trực tuyến đầu ra là có một cách chính xác với cùng mã và sử dụng chuỗi @"est un r\u00EAve en noir" nhưng tôi nghĩ rằng UTF16 Đại diện nếu tôi không nhầm lẫn. Bây giờ tôi đang thực sự sửa lỗi cách phân tích nguồn cấp dữ liệu này.

+0

giải pháp hoàn hảo http://stackoverflow.com/questions/6204718/status-code-0-on-google-geocode-api-from-iphone-sim-but-works-fine-on-web -non/6204970 # 6204970 xin chúc mừng ... – Moacir

Trả lời

11

Tôi nghĩ rằng trường hợp kiểm tra bị hỏng; như sau:

NSString* str1 = @"est un r \u00c3\u00aa ve en noir"; 
NSLog(@"%@", str1); 

Ngoài ra kết quả đầu ra 'cũng không có kết quả'. Tuy nhiên, điều này: 'est un Rêve en noir'

NSString* str1 = @"est un rêve en noir"; 
NSLog(@"%@", str1); 

đầu ra, cũng như:

NSString* str1 = @"est un rêve en noir"; 

NSString* str = [NSString stringWithUTF8String:[str1 cStringUsingEncoding:NSUTF8StringEncoding]]; 
NSLog(@"%@", str); 

Và như trên cho các phiên bản hơi ngắn hơn:

NSString* str1 = @"est un rêve en noir"; 

NSString* str = [NSString stringWithUTF8String:[str1 UTF8Encoding]]; 
NSLog(@"%@", str); 

Và, quả thật vậy:

char *str1 = "est un r\xc3\xaave en noir"; 

NSString* str = [NSString stringWithUTF8String:str1]; 
NSLog(@"%@", str); 

Tôi nghĩ đó là nhiệm vụ trên JSON, không phải UTF8. \ U theo sau là bốn chữ số thập lục phân là cách mã hóa JSON một ký tự UTF16 chung, nó không phải là một phần vốn có của UTF. Vì vậy, NSString không biết làm thế nào để đối phó với nó. Trình phân tích cú pháp JSON của bạn cần được điều chỉnh để phân tích cú pháp các chuỗi thoát đúng cách.

+0

đã đồng ý, nếu đầu ra json là thực tế utf-8, nó sẽ giống như, – heisian

38

Sau nhiều đau buồn, tôi đã tìm ra điều này. Dùng cái này.

NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding]; 
+1

Cảm ơn rất nhiều, chính xác những gì tôi đang tìm kiếm. – Luc

+0

Không sao cả. Chỉ là một cảnh báo, tôi đã gặp sự cố rò rỉ bộ nhớ với giải pháp này. Tôi nghĩ * tôi đã sửa với [NSString stringWithString: (đoạn mã trên)] –

+1

Bạn là người bảo vệ cuộc sống. Sau khi tìm kiếm rất nhiều giờ, tôi gần như sắp bỏ cuộc. Và sau đó, tôi tìm thấy đoạn mã nhỏ ngọt ngào này. Cảm ơn rất nhiều. Đây sẽ là câu trả lời được chấp nhận. –

0

Trong iOS 9 không cần làm gì cả. Nó được chuyển đổi tự động.

NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request 
                   fromData:postData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

                    NSLog(@"response header: %@",response); 

                    NSString* aStr; 
                   aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
                   NSLog(@"response data: %@", aStr); 

                   NSDictionary * json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 

                   for (NSDictionary *dict in json) 
                   { 
                    NSLog(@"%@", dict); 
                    NSString *name = [dict objectForKey:@"name"]; 
                    NSString *msg = [dict objectForKey:@"message"]; 
                    NSString *topic = [dict objectForKey:@"topic"]; 
                    NSLog(@"*********** %@, %@, %@", name,topic,msg); 

                    // now do something 
                    } 
0

khi gửi đến máy chủ

NSString* str1 = @"est un r \u00c3\u00aa ve en noir"; 
    NSData *str1Data = [str1 dataUsingEncoding:NSNonLossyASCIIStringEncoding]; 
    NSString *str2 = [[NSString alloc] initWithData:str1Data encoding:NSUTF8StringEncoding]; 

Sau khi nhận được bạn có thể giải mã như thế này

NSData *recivedStrData = [recivedStr dataUsingEncoding:NSUTF8StringEncoding]; 
    NSString *strResult = [[NSString alloc] initWithData:recivedStrData encoding:NSNonLossyASCIIStringEncoding]; 

này làm việc cho tôi!

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