2012-08-30 44 views
12

tôi thấy các tiêu chuẩn C (C99 và C11) mơ hồ đối với vị trí mã ký tự/chuỗi và các quy tắc mã hóa với:tiêu chuẩn C: Character thiết và mã hóa chuỗi đặc điểm kỹ thuật

Thứ nhất tiêu chuẩn định nghĩa the source character setthe execution character set. Về cơ bản, nó cung cấp một bộ glyph, nhưng không liên kết bất kỳ giá trị số với chúng - Vì vậy, bộ ký tự mặc định là gì?

Tôi không hỏi về mã hóa ở đây mà chỉ là hình tượng/tiết mục để ánh xạ điểm số/mã. Nó xác định universal character names là ISO/IEC 10646, nhưng nó có nói rằng đây là bộ ký tự mặc định không?

Là tiện ích mở rộng ở trên - Tôi không thể tìm thấy bất kỳ thông tin nào cho biết ký tự nào là số trình tự thoát số \ 0 và \ x đại diện.

Từ các tiêu chuẩn C (C99 và C11, tôi đã không kiểm tra ANSI C) Tôi đã nhận các sau đây về nhân vật và chuỗi literals:

+---------+-----+------------+----------------------------------------------+ 
| Literal | Std | Type  | Meaning          | 
+---------+-----+------------+----------------------------------------------+ 
| '...' | C99 | int  | An integer character constant is a sequence | 
|   |  |   | of one or more multibyte characters   | 
| L'...' | C99 | wchar_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| u'...' | C11 | char16_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| U'...' | C11 | char32_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| "..." | C99 | char[]  | A character string literal is a sequence of | 
|   |  |   | zero or more multibyte characters   | 
| L"..." | C99 | wchar_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| u8"..." | C11 | char[]  | A UTF-8 string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| u"..." | C11 | char16_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| U"..." | C11 | char32_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
+---------+-----+------------+----------------------------------------------+ 

Tuy nhiên tôi không thể tìm thấy bất cứ điều gì về mã hóa quy tắc cho những chữ này. UTF-8 dường như gợi ý mã hóa UTF-8, nhưng tôi không nghĩ rằng nó được đề cập rõ ràng ở bất kỳ đâu. Ngoài ra, đối với các loại khác là mã hóa không xác định hoặc thực hiện phụ thuộc?

Tôi không quen với đặc tả UNIX. Đặc tả UNIX có chỉ định bất kỳ ràng buộc bổ sung nào đối với các quy tắc này không?

Ngoài ra, nếu có ai có thể cho tôi biết lược đồ mã hóa/mã hóa nào được GCC và MSVC sử dụng cũng sẽ hữu ích.

Trả lời

5

C không tham lam về bộ ký tự. Không có điều gì như "bộ ký tự mặc định", nó được thực hiện xác định - mặc dù nó chủ yếu là ASCII hoặc UTF-8 trên hầu hết các hệ thống hiện đại.

+0

Nó cũng được thực hiện được xác định cho chữ "u8" ...? Nó dường như gợi ý về mã hóa UTF-8 cho chữ đó. – tinkerbeast

+0

@tinkerbeast no - C không yêu cầu bất kỳ bộ ký tự cụ thể nào. u8 "..."chỉ ra rằng chuỗi nên được tạo thành từ các ký tự phù hợp với bộ nhớ tám bit. –

+0

@ H2CO3 C11 không nói chữ u8 là utf-8. Tôi không chắc chắn các trình biên dịch đã có được xung quanh để thực hiện điều đó chưa, mặc dù – nos

4

Tiêu chuẩn không chỉ định mã hóa mặc định vì thực tế hiện tại đã có C được triển khai trên các máy có nhiều mã hóa khác nhau, ví dụ như khung chính Honeywell và khung chính của IBM.

Tôi hy vọng gcc sẽ mặc định gcc từ ngôn ngữ hiện được chỉ định bởi LC_CHARSET, nhưng tôi chưa bao giờ thử nghiệm nó.

VC++ có cài đặt mặc định từ cài đặt Bảng điều khiển. Cài đặt Bảng điều khiển mặc định thay đổi theo quốc gia mà Windows đã được mua và hầu hết người dùng không bao giờ thay đổi, nhưng họ có thể thay đổi cài đặt trong khi cài đặt Windows có thể thay đổi sau này.

Trigraphs được phát minh sao cho chương trình nguồn có thể được sao chép từ môi trường với một miền địa phương sang môi trường có ngôn ngữ hơi khác và vẫn được biên dịch. Ví dụ: nếu người dùng Windows ở Trung Quốc sử dụng các dấu vết thì người dùng Windows ở Hy Lạp có thể biên dịch cùng một chương trình nguồn. Tuy nhiên, nếu các ngôn ngữ khác nhau quá nhiều, ví dụ một cách sử dụng EBCDIC và một bằng cách sử dụng EUC, các dấu vết sẽ không đủ.

+0

BTW, bạn có bất kỳ ý tưởng tại sao các trigraphs đã được chọn để được xấu xí như vậy, bất kỳ lý do tại sao họ hoạt động trong chuỗi Lý thuyết của tôi, nhìn vào mã số, là họ đã được chọn bởi một người thụ động-agressive người không muốn họ ở nơi đầu tiên.Tôi nghĩ rằng nó nên đã được hoàn toàn đủ để cung cấp rằng nếu một dòng bắt đầu với '#define __BACKSLASH_DESIGNATOR', bất kỳ lần xuất hiện nào của ký tự hoặc chuỗi tiếp theo (phải chứa ít nhất một ký tự bên ngoài bộ tiêu chuẩn C) sẽ được coi là dấu gạch chéo ngược; . – supercat

+1

@supercat: [Trang này] (http://www.lysator.liu.se/c/rat/b.html#2-2-1-1) giải thích mục đích của các dấu vết. Nó xuất phát từ khi tiêu chuẩn ANSI C vẫn là bản nháp, và là một phần của tài liệu có chứa lý do cho nhiều quyết định được đưa ra trong tiêu chuẩn đó. –

+0

@PeterO .: Cảm ơn vì điều đó. Tôi vẫn thấy mình tò mò liệu bất kỳ bộ ký tự nào đã được sử dụng không có dấu gạch chéo ngược * và * không có ký tự không phải ASCII có thể được khai báo có cùng tác dụng không? Khi tôi lập trình PL/I, các thiết bị đầu cuối đều là ASCII và không có ký tự '¬' cho PL/I, nhưng vì PL/I không sử dụng'^', bản dịch ASCII-to-EBCDIC đơn giản đã chuyển đổi ASCII '^' thành EBCDIC '¬'. Tôi tự hỏi nếu cách tiếp cận tương tự có thể đã làm việc với C - tuyên bố rằng mọi thực hiện phải chỉ định một ký tự "thoát" (sẽ là '\' cho ASCII), và ... – supercat

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