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.
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.

Ý nghĩa ban đầu của ký tự này tương tự như NOP&mdash;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. 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, thường được gọi là *chuỗi kết thúc rỗng* (null-terminated string). Đ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

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. 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. 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.

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ữ  và nhấn  (thường cũng được yêu cầu phải giữ phím  và nhấn phím khác như  hoặc ).

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 (␀)—nhưng đây không phải là ký tự rỗng thật sự, U+0000.

## Mã hóa

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
* Ký tự điều khiển

## Tham khảo

## Liên kết ngoài
* Null Byte Injection WASC Threat Classification Null Byte Attack section
* Poison Null Byte Introduction Introduction to Null Byte Attack