Ký tự rỗng
Ký tự rỗng (null character) hay còn được gọi là dấu kết rỗng (null terminator), viết tắt: NULL, là một ký tự điều khiển có giá trị zero.[1][2] Ký tự rỗng hiện diện ở nhiều bảng mã, bao gồm ISO/IEC 646 (hoặc ASCII), mã điều khiển C0, Bảng mã phổ quát (Universal Character Set hoặc Unicode), và EBCDIC. Nó có mặt ở hầu hết các ngôn ngữ lập trình chủ yếu.[3]
Ý nghĩa ban đầu của ký tự này tương tự như NOP—tức khi được gởi tới một máy in hoặc một thiết bị đầu cuối, ký tự rỗng không làm các thiết bị này thực hiện một thao tác nào cả (tuy vậy, vài thiết bị cuối vẫn hiển thị (một cách không chính xác) một ký tự space). Khi máy viễn ấn điện cơ trở thành thiết bị đầu ra máy tính, một hoặc vài ký tự rỗng được gởi ở cuối mỗi dòng in để giúp cho chiếc máy có thêm thời gian trở về vị trí đầu dòng in kế tiếp.[cần dẫn nguồn] Trong dãy băng đục lỗ, ký tự rỗng được thể hiện ở dạng không có lỗ đục nào cả, vì thế, một dãy băng chưa đục lỗ được xem như là đã được khởi tạo với toàn bộ ký tự rỗng, và sau đó, văn bản thường được "chèn" vào những vị trí mà trước đó là ký tự rỗng bằng cách đục ký tự mới vào chỗ thể hiện ký tự rỗng đó.
Ngày nay, ký tự rỗng đóng vai trò khá quan trọng trong ngôn ngữ lập trình C và các biến thể của ngôn ngữ này và ở nhiều định dạng dữ liệu, khi nó đóng vai trò một ký tự được định sẵn, đánh dấu kết thúc chuỗi,[4] thường được gọi là chuỗi kết thúc rỗng (null-terminated string).[5] Điều này cho phép chuỗi có độ dài tùy ý, với việc khai báo dư thêm một byte; đây là một lựa chọn song song với cách lưu chuỗi kèm biến đếm số ký tự (bắt buộc) cho chuỗi có độ dài giới hạn tới 255 byte hoặc có độ dài ít một byte so với khai báo (Xem thêm ưu điểm và hạn chế ở bài chuỗi kết thúc rỗng).
Biểu diễn
[sửa | sửa mã nguồn]Ký tự rỗng thường được biểu diễn dưới dạng dãy ký tự thoát (escape sequence) \0
trong hằng ký tự hoặc hằng chuỗi trong mã nguồn.[6] Trong nhiều ngôn ngữ (như C, sử dụng cách biểu diễn này), đây không phải là một dãy ký tự thoát riêng rẻ, mà là một dãy ký tự thoát bát phân với chữ số bát phân 0; hệ quả là, theo sau \0
không được phép có bất kỳ chữ số 0
tới 7
nào; nếu không, nó sẽ bị trình biên dịch xem như nơi bắt đầu của một dãy ký tự thoát bát phân với độ dài lớn hơn.[7] Các biểu diễn ký tự rỗng trong dãy ký tự thoát ở các ngôn ngữ khác là \000
, \x00
, \z
, hoặc mã \u0000
trong bảng mã Unicode. Ký tự rỗng trong một URL có thể bị thay thế bằng %00
.
Khả năng biểu diễn ký tự rỗng không phải lúc nào cũng khiến chuỗi kết quả được biên dịch đúng, bởi nhiều chương trình sẽ hiểu ký tự rỗng là kết thúc một chuỗi. Vì thế khả năng đánh máy (trong trường hợp giá trị nhập vào của người dùng chưa được kiểm tra) tạo ra lỗ hổng tiêm byte rỗng (null byte injection) và có thể dẫn đến việc khai thác vấn đề bảo mật hệ thống để thực hiện thành vi phá hoại.[8]
Trong hệ ký hiệu dấu mũ (caret notation) ký tự rỗng được biểu diễn dưới dạng ^@
. Ở một vài bàn phím, người dùng có thể nhập ký tự rỗng bằng cách giữ Ctrl và nhấn @ (thường cũng được yêu cầu phải giữ phím ⇧ Shift và nhấn phím khác như 2 hoặc P).
Trong tài liệu văn bản, ký tự rỗng đôi khi được biểu diễn dưới dạng một biểu tượng có chiều dài 1 em chứa chữ "NUL". Trong Unicode, có một ký tự với glyph tương ứng dành cho việc hiển thị ký tự rỗng, "symbol for null", U+2400 (␀)[9]—nhưng đây không phải là ký tự rỗng thật sự, U+0000.
Mã hóa
[sửa | sửa mã nguồn]Trong tất cả các bảng mã hiện đại, ký tự rỗng có giá trị điểm mã là zero. Trong hầu hết cách thức mã hóa, nó được dịch thành một đơn vị mã có giá trị zero. Ví dụ như trong UTF-8 nó là một byte zero đơn lẻ. Tuy nhiên, trong Modified UTF-8 ký tự rỗng được mã hóa thành hai byte: 0xC0, 0x80. Điều này cho phép byte có giá trị zero, không còn được dùng cho bất kỳ ký tự nào nữa, được sử dụng như một dấu kết chuỗi.
Xem thêm
[sửa | sửa mã nguồn]Tham khảo
[sửa | sửa mã nguồn]- ^ ASCII format for Network Interchange. IETF. sec. 5.2. RFC 20. https://tools.ietf.org/html/rfc20#section-5.2. "NUL (Null): The all-zeros character which may serve to accomplish time fill and media fill."
- ^ “The set of control characters of the ISO 646” (PDF). Secretariat ISO/TC 97/SC 2. ngày 1 tháng 12 năm 1975. tr. 4.4. Bản gốc (PDF) lưu trữ ngày 12 tháng 5 năm 2014. Truy cập ngày 17 tháng 1 năm 2017.
Position: 0/0, Name: Null, Abbreviation: Nul
- ^ "A byte with all bits set to 0, called the null character, shall exist in the basic execution character set; it is used to terminate a character string literal." — ANSI/ISO 9899:1990 (the ANSI C standard), section 5.2.1
- ^ "A string is a contiguous sequence of characters terminated by and including the first null character" — ANSI/ISO 9899:1990 (the ANSI C standard), section 7.1.1
- ^ Working Draft, Standard for Programming Language C++ (PDF) (ISO 14882 standard working draft), ISO/IEC, ngày 28 tháng 2 năm 2011, tr. 427, N3242=11-0012, truy cập ngày 27 tháng 2 năm 2013,
A null-terminated byte string, or NTBS, is a character sequence whose highest-addressed element with defined content has the value zero (the terminating null character); no other element in the sequence has the value zero.
- ^ Kernighan and Ritchie, C, p. 38
- ^ In YAML this combination is a separate escape sequence.
- ^ Null Byte Injection WASC Threat Classification Null Byte Attack section.
- ^ “Unicode Character 'SYMBOL FOR NULL' (U+2400)”. Truy cập 31 tháng 1 năm 2017.
Liên kết ngoài
[sửa | sửa mã nguồn]- Null Byte Injection WASC Threat Classification Null Byte Attack section
- Poison Null Byte Introduction Introduction to Null Byte Attack