Bạn cần phân biệt giữa bộ ký tự nguồn, bộ ký tự thực thi, bộ ký tự thực thi dòng và phiên bản cơ sở của chúng:
Bộ ký tự nguồn cơ bản:
§2.1.1: Bộ ký tự nguồn cơ bản bao gồm 96 ký tự […]
Bộ ký tự này có chính xác 96 ký tự. Chúng phù hợp với 7 bit. hình ảnh
@
Những ký tự như vậy không được bao gồm.
Hãy lấy một số biểu diễn nhị phân ví dụ cho một số ký tự nguồn cơ bản. Chúng có thể hoàn toàn tùy ý, không cần những giá trị này phải tương ứng với các giá trị ASCII.
A -> 0000000
B -> 0100100
C -> 0011101
Bộ ký tự thực thi cơ bản...
§2.1.3: Bộ ký tự thực thi cơ bản và bộ ký tự rộng thực thi cơ bản sẽ chứa tất cả các thành viên của bộ ký tự nguồn cơ bản, cộng với các ký tự điều khiển biểu thị cảnh báo, phím lùi và trả về đầu dòng, cộng với một ký tự rỗng (tương ứng, ký tự rộng null), có biểu diễn tất cả các bit bằng 0.
Như đã đề cập trước đó, bộ ký tự thực thi cơ bản chứa tất cả các thành viên của bộ ký tự nguồn cơ bản. Nó vẫn không chứa bất kỳ ký tự nào khác như
@
.Bộ ký tự thực thi cơ bản có thể có các biểu diễn nhị phân khác nhau.
Như đã đề cập trước đó, bộ ký tự thực thi cơ bản chứa các biểu diễn trả về đầu dòng, ký tự null và các ký tự khác.
A -> 10110101010
B -> 00001000101 <- bộ ký tự nguồn cơ bản
C -> 10101011111
-------------------------------------------------- --------
null -> 00000000000
Phím lùi -> 11111100011
Nếu độ dài bộ ký tự thực thi cơ sở là 11 bit (như trong ví dụ này), thì kiểu dữ liệu char phải đủ lớn để lưu trữ 11 bit, nhưng có thể dài hơn.
...và về cơ bản thực hiện các bộ ký tự rộng:
Việc triển khai cơ bản các ký tự rộng là dành cho các ký tự rộng (wchar_t). Về cơ bản, nó giống như bộ ký tự rộng triển khai cơ bản, nhưng cũng có thể có các cách biểu diễn nhị phân khác nhau.
A -> 1011010101010110101010
B -> 0000100010110101011111 <- bộ ký tự nguồn cơ bản
C -> 1010100101101000011011
-------------------------------------------------- -------------------
null -> 0000000000000000000000
Phím lùi -> 1111110001100000000001
Thành viên cố định duy nhất là ký tự null, cần được
0
các bit tuần tự.
Chuyển đổi giữa các bộ ký tự cơ bản:
§2.1.1.5: Mỗi thành viên của bộ ký tự nguồn, chuỗi thoát hoặc tên ký tự phổ quát trong các ký tự chữ và chuỗi ký tự được chuyển đổi thành một thành viên của bộ ký tự thực thi (2.13.2, 2.13.4).
Sau đó biên dịch tệp nguồn C++ để chuyển đổi từng ký tự của bộ ký tự nguồn thành bộ ký tự thực thi cơ bản (rộng).
Ví dụ:
const char* string0 = "BA\bC";
const wchar_t string1 = L"BA\bC";
từ
chuỗi0
là các ký tự thông thường sẽ được chuyển đổi thành bộ ký tự thực thi cơ bản và
chuỗi1
Chuyển đổi sang bộ ký tự rộng thực thi cơ bản.
chuỗi0 -> 00001000101 10110101010 11111100011 10101011111
chuỗi1 -> 0000100010110101011111 1011010101010110101010 // tiếp tục
11111100011000000000001 1010100101101000011011
Về mã hóa tập tin:
Có một số mã hóa tập tin. Ví dụ
ASCII
Cái này dài 7 bit.
Windows-1252
Nó dài 8 bit (được gọi là
ANSI
).
ASCII
Không chứa các ký tự không phải tiếng Anh.
ANSI
Chứa một số ký tự châu Âu như
ä Ö ä Õ ø
.
Mã hóa tập tin mới hơn như
UTF-8
hoặc
UTF-32
Có thể chứa các ký tự từ bất kỳ ngôn ngữ nào.
UTF-8
Độ dài ký tự có thể thay đổi.
UTF-32
dài 32 ký tự.
Yêu cầu mã hóa tập tin:
Hầu hết các trình biên dịch đều cung cấp các chuyển đổi dòng lệnh để chỉ định mã hóa tệp của tệp nguồn.
Các tệp nguồn C++ cần được mã hóa bằng mã hóa tệp có biểu diễn bộ ký tự nguồn cơ sở. Ví dụ: mã hóa tệp của tệp nguồn cần phải là
;
Biểu thị tính chất.
Nếu bạn có thể nhập ký tự
;
Trong mã hóa được chọn làm mã hóa tệp nguồn, mã hóa không phù hợp làm mã hóa tệp nguồn c++.
Bộ ký tự không cơ bản:
Các ký tự không có trong bộ ký tự nguồn cơ bản sẽ thuộc về bộ ký tự nguồn. Bộ ký tự nguồn tương đương với mã hóa tệp.
Ví dụ:
@
Ký tự này không có trong các ký tự nguồn cơ bản nhưng nó có thể có trong bộ ký tự nguồn. Mã hóa tập tin đã chọn của tập tin nguồn đầu vào có thể chứa
@
đại diện. .nếu nó không chứa
@
có nghĩa là bạn không thể sử dụng ký tự
@
trong chuỗi.
Các ký tự không có trong bộ ký tự cơ bản (rộng) thuộc về bộ ký tự điều hành (rộng).
Hãy nhớ rằng trình biên dịch chuyển đổi các ký tự từ bộ ký tự nguồn sang bộ ký tự thực thi và bộ ký tự rộng thực thi. Vì vậy cần phải có cách chuyển đổi các ký tự này.
Ví dụ: nếu bạn chỉ định
Windows-1252
Khi mã hóa bộ ký tự nguồn và chỉ định
ASCII
Là bộ ký tự rộng triển khai, chuỗi này không thể được chuyển đổi:
const char* string0 = "chuỗi ký tự châu Âu ö, Ä, ô, Ð.";
Những ký tự này không thể được sử dụng
ASCII
thể hiện.
Chỉ định bộ ký tự:
Dưới đây là một số ví dụ về cách chỉ định bộ ký tự bằng gcc. Bao gồm các giá trị mặc định.
-finput-charset=UTF-8 <- bộ ký tự nguồn
-fexec-charset=UTF-8 <- bộ ký tự thực thi
-fwide-exec-charset=UTF-32 <- bộ ký tự rộng thực thi
Sử dụng UTF-8 và UTF-32 làm mã hóa mặc định, các tệp nguồn C++ có thể chứa các chuỗi có ký tự ở bất kỳ ngôn ngữ nào. Các ký tự UTF-8 có thể được chuyển đổi theo cả hai hướng mà không gặp vấn đề gì.
Bộ ký tự mở rộng:
§1.1.3: ký tự nhiều byte, một chuỗi gồm một hoặc nhiều byte đại diện cho một thành viên của bộ ký tự mở rộng của nguồn hoặc môi trường thực thi. Bộ ký tự mở rộng là siêu bộ của bộ ký tự cơ bản (2.2).
Các ký tự nhiều byte dài hơn các mục dành cho ký tự thông thường. Chúng chứa một chuỗi thoát đánh dấu chúng là các ký tự nhiều byte.
Các ký tự nhiều byte được xử lý theo ngôn ngữ được đặt trong môi trường thời gian chạy của người dùng. Các ký tự nhiều byte này được chuyển đổi trong thời gian chạy thành bộ mã hóa trong môi trường của người dùng.
Tôi là một lập trình viên xuất sắc, rất giỏi!