2010-10-22 46 views
12

Tôi biết rằng các chuỗi C là char [] với một '\ 0' trong phần tử cuối cùng. Nhưng các ký tự được mã hóa như thế nào?Mã hóa mặc định cho chuỗi C là gì?

Cập nhật: Tôi tìm thấy liên kết này mát mẻ mà nói về nhiều ngôn ngữ lập trình khác và các công ước mã hóa của họ: Link

Trả lời

7

Tất cả tiêu chuẩn nói về vấn đề là bạn nhận được ít nhất 52 ký tự chữ cái Latinh viết thường và chữ thường, các chữ số từ 0 đến 9, ký hiệu ! " # % & ' () * + , - ./: ; <=> ? [ \ ]^_ { | } ~ và ký tự khoảng trắng, và kiểm soát các ký tự đại diện cho tab ngang , tab dọc và nguồn cấp dữ liệu biểu mẫu.

Điều duy nhất nó nói về mã hóa số là tất cả các giá trị trên phù hợp với một byte và giá trị của mỗi chữ số sau 0 là giá trị lớn hơn giá trị của số trước đó.

Mã hóa thực tế có thể được kế thừa từ cài đặt ngôn ngữ của bạn. Có lẽ một cái gì đó tương thích ASCII.

+0

Tôi đoán miền địa phương cũng có thể cấu hình trong trình biên dịch. Chỉ cần tìm hiểu về tùy chọn -finput-charset của gcc (http://gcc.gnu.org/onlinedocs/cpp/Invocation.html). Mặc định có vẻ là UTF8. Không có thắc mắc tôi đã có thể in UTF8Strings. – Plumenator

+0

Tiêu chuẩn cũng có nói bất cứ điều gì về các giá trị thứ tự của bảng chữ cái không? – Plumenator

+0

@Plumenator: Không. Thậm chí không có yêu cầu '' A '<' B''. –

6

Các tiêu chuẩn không xác định này. Thông thường với ASCII.

+0

Trong mục tiêu-C Tôi có thể tạo chuỗi C bằng cách sử dụng câu lệnh, char * cStr = [objcStr UTF8String] và in dưới dạng printf ("% s", cStr). Nó có hoạt động không vì ASCII là tập hợp con của UTF8? – Plumenator

+0

Có, ASCII là một tập con của UTF8. – fresskoma

+3

@Plumenator Nó hoạt động vì UTF-8 được thiết kế càng rõ ràng càng tốt để mã đã xử lý ASCII, và vì thiết bị đầu cuối của bạn hỗ trợ UTF-8 – nos

1

Chúng không thực sự được "mã hóa" như vậy, chúng được lưu trữ đơn giản như hiện trạng. Chuỗi "hello" đại diện cho một mảng có giá trị char 'h', 'e', 'l', 'l', 'o''\0', theo thứ tự đó. Chuẩn C có một bộ ký tự cơ bản bao gồm các ký tự này, nhưng không chỉ định một mã hóa thành các byte. Nó có thể là EBCDIC, cho tất cả các bạn biết.

+0

Lưu ý: '\ 0' nghĩa đen là số bát phân 0 với một loại char. Vì vậy, có các ký tự chấm dứt luôn luôn là nghĩa đen là 0. –

+0

@Martin: cảm ơn vì đã chỉ ra điều đó. Tôi luôn luôn quên các quy tắc lạ xung quanh con trỏ null có áp dụng cho các ký tự null không. –

+0

@Martin: Về mặt kỹ thuật, loại ký tự bằng chữ là 'int' (ít nhất là trong C) ... –

6

Chuỗi c chỉ là một chuỗi các byte. Điều đó có nghĩa là, nó không có mã hóa được xác định rõ ràng, nó có thể là ASCII, UTF8 hoặc bất kỳ thứ gì khác, cho vấn đề đó. Bởi vì hầu hết các hệ điều hành hiểu ASCII theo mặc định, và mã nguồn chủ yếu được viết bằng mã hóa ASCII, vì vậy dữ liệu bạn sẽ tìm thấy trong một đơn giản (char *) sẽ rất thường xuyên được ASCII. Tuy nhiên, không đảm bảo rằng những gì bạn nhận được từ một (char *) sẽ là UTF8 hoặc thậm chí KOI8.

+0

Trên thực tế, hệ điều hành hiện đại nhất sử dụng một chuỗi ký tự rộng trong tất cả các giao diện bên trong (Win/Linux/Mac). Vì vậy, nó không phải là ASCII họ sử dụng. –

+0

Tôi đã không nói rằng họ sử dụng ASCII theo mặc định trong giao diện của họ, nhưng họ unterstand ASCII :) – fresskoma

+0

"nó không thực sự có bất kỳ mã hóa" Văn bản được lưu trữ kỹ thuật số luôn có một số mã hóa. – Praxeolitic

1

Như đã chỉ định khác, C có một số hạn chế những gì được phép đối với mã hóa ký tự nguồn và thực thi, nhưng tương đối dễ chấp nhận. Vì vậy, đặc biệt nó không nhất thiết phải ASCII, và trong hầu hết các trường hợp ngày nay ít nhất là một phần mở rộng của điều đó.

Môi trường thực thi của bạn có nghĩa là thực hiện một bản dịch cuối cùng giữa bộ ký tự nguồn và thực thi. Vì vậy, thông thường bạn không nên quan tâm đến việc mã hóa và ngược lại cố gắng mã độc lập với nó. Đây là lý do tại sao có các chuỗi thoát đặc biệt cho các ký tự đặc biệt như '\n' hoặc '\t' và mã hóa ký tự phổ biến như '\u0386'. Vì vậy, thông thường bạn không cần phải tìm kiếm các mã hóa cho các ký tự thực hiện đặt mình.

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