2009-03-20 23 views
5

String Format Specifiers tuyên bố tài liệu của Apple,Tại sao NSString và NSLog xuất hiện để xử lý% C và% lc (và% S và% ls) khác nhau?

Các specifiers định dạng được hỗ trợ bởi các phương pháp định dạng NSString và chức năng định dạng CFString theo IEEE printf specification; … Bạn cũng có thể sử dụng các thông số định dạng này với chức năng NSLog.

Nhưng, trong khi đặc điểm kỹ thuật printf định nghĩa %C như tương đương cho %lc%S như tương đương cho %ls, chỉ %C%S xuất hiện để làm việc một cách chính xác với NSLog+[NSString stringWithFormat:].

Ví dụ, hãy xem xét đoạn mã sau:

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    unichar str[3]; 
    str[0] = 63743; 
    str[1] = 33; 
    str[2] = (unichar)NULL; 

    NSLog(@"NSLog"); 
    NSLog(@"%%S: %S", str); 
    NSLog(@"%%ls: %ls", str); 

    NSLog(@"%%C: %C", str[0]); 
    NSLog(@"%%lc: %lc", str[0]); 

    NSLog(@"\n"); 
    NSLog(@"+[NSString stringWithFormat:]"); 

    NSLog(@"%%S: %@", [NSString stringWithFormat:@"%S", str]); 
    NSLog(@"%%ls: %@", [NSString stringWithFormat:@"%ls", str]); 

    NSLog(@"%%C: %@", [NSString stringWithFormat:@"%C", str[0]]); 
    NSLog(@"%%lc: %@", [NSString stringWithFormat:@"%lc", str[0]]); 

    [pool drain]; 
    return 0; 
} 

Với đặc điểm kỹ thuật printf, tôi mong chờ từng cặp ở trên để in các điều tương tự. Nhưng, khi tôi chạy mã, tôi nhận được kết quả sau:

2009-03-20 17:00:13.363 UnicharFormatSpecifierTest[48127:10b] NSLog 
2009-03-20 17:00:13.365 UnicharFormatSpecifierTest[48127:10b] %S: ! 
2009-03-20 17:00:13.366 UnicharFormatSpecifierTest[48127:10b] %ls: ˇ¯! 
2009-03-20 17:00:13.366 UnicharFormatSpecifierTest[48127:10b] %C:  
2009-03-20 17:00:13.367 UnicharFormatSpecifierTest[48127:10b] %lc: 
2009-03-20 17:00:13.367 UnicharFormatSpecifierTest[48127:10b] 
2009-03-20 17:00:13.368 UnicharFormatSpecifierTest[48127:10b] +[NSString stringWithFormat:] 
2009-03-20 17:00:13.368 UnicharFormatSpecifierTest[48127:10b] %S: ! 
2009-03-20 17:00:13.369 UnicharFormatSpecifierTest[48127:10b] %ls: ˇ¯! 
2009-03-20 17:00:13.369 UnicharFormatSpecifierTest[48127:10b] %C:  
2009-03-20 17:00:13.370 UnicharFormatSpecifierTest[48127:10b] %lc: 

Tôi có làm gì sai, hoặc đây có phải là lỗi trong mã của Apple không?

Trả lời

6

Trên Mac OS X, <machine/_types.h> xác định wchar_tint, vì vậy, bốn byte (32 bit) trên tất cả các kiến ​​trúc hiện được hỗ trợ.

Như bạn lưu ý, printf (3) manpage định nghĩa %S như tương đương với %ls, trong đó có một con trỏ đến một số wchar_t ký tự (wchar_t *).

Các tài liệu Cocoa bạn liên kết với (và CF tương đương), tuy nhiên, không xác định %S riêng:

  • %S: mảng Null-terminated của 16-bit ký tự Unicode

Nhấn mạnh được thêm vào. Ngoài ra, cũng vậy với %C.

Vì vậy, đây không phải là lỗi. CF và Cocoa giải thích %S%C khác với cách printf và người anh em họ của nó giải thích chúng. CF và Cocoa đối xử với (các) ký tự như UTF-16, trong khi printf (có lẽ) xử lý chúng như là UTF-32.

Giải thích CF/Cocoa hữu ích hơn khi làm việc với Dịch vụ cốt lõi, vì một số API (chẳng hạn như Trình quản lý tệp) sẽ đưa văn bản của bạn dưới dạng mảng UniChar s chứ không phải CFString; miễn là bạn vô hiệu hóa mảng đó, bạn có thể sử dụng nó với %S để in chuỗi.

+0

Cảm ơn; Điều đó làm cho rất nhiều ý nghĩa! Tôi nghĩ rằng tôi sẽ mô tả này như là một lỗi trong tài liệu, sau đó, bởi vì các phương pháp định dạng NSString rõ ràng không làm theo các đặc điểm kỹ thuật printf trong trường hợp này. Điều đó có vẻ giống như một đánh giá công bằng? –

+0

Lỗi vừa phải; nó nên nói một cái gì đó như "..., với một vài biến thể", và đánh dấu chúng trong bảng.Tài liệu này mô tả chính xác các diễn giải của CF/Cocoa trong bảng, mặc dù nó không gắn cờ chúng như khác với định nghĩa của printf. –

+0

Đó là về cách tôi sẽ mô tả nó, là tốt. Cảm ơn một lần nữa vì sự giúp đỡ! –

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