Mã ASCII là 7-bit hay 8-bit?


100

Giáo viên của tôi nói với tôi ASCII là chương trình mã hóa ký tự 8 bit. Nhưng nó chỉ được định nghĩa cho các mã 0-127, có nghĩa là nó có thể vừa với 7-bit. Vì vậy, không thể lập luận rằng bit ASCII thực sự là mã 7 bit?

Và chúng ta muốn nói gì khi nói ASCII là mã 8-bit?

Câu trả lời:


90

ASCII thực sự ban đầu được hình thành như một mã 7 bit. Điều này đã được thực hiện tốt trước khi byte 8 bit trở nên phổ biến và thậm chí vào những năm 1990, bạn có thể tìm thấy phần mềm giả định rằng nó có thể sử dụng bit thứ 8 của mỗi byte văn bản cho các mục đích riêng ("không phải là 8 bit sạch"). Ngày nay, mọi người nghĩ về nó như một mã hóa 8 bit, trong đó các byte từ 0x80 đến 0xFF không có ý nghĩa xác định, nhưng đó là một retcon .

Có hàng chục mã hóa văn bản sử dụng bit thứ 8; chúng có thể được phân loại là tương thích với ASCII hoặc không, và chiều rộng cố định hoặc thay đổi. Tương thích với ASCII có nghĩa là bất kể ngữ cảnh , các byte đơn lẻ có giá trị từ 0x00 đến 0x7F mã hóa các ký tự giống như trong ASCII. Bạn không muốn liên quan gì đến mã hóa văn bản không tương thích ASCII nếu bạn có thể tránh được; các chương trình ngây thơ mong đợi ASCII có xu hướng hiểu sai về chúng theo kiểu thảm khốc, thường là phá vỡ an ninh. Ngày nay chúng không còn được dùng nữa nên (ví dụ) HTML5 cấm sử dụng chúng trên trang Web công cộng, ngoại trừ UTF-16 . Tôi sẽ không nói về chúng nữa.

Mã hóa độ rộng cố định có nghĩa là nó giống như thế nào: tất cả các ký tự đều được mã hóa bằng cách sử dụng cùng một số byte. Để tương thích với ASCII, mã hóa cố định với phải mã hóa tất cả các ký tự của nó chỉ bằng một byte, vì vậy nó không thể có nhiều hơn 256 ký tự. Mã hóa phổ biến nhất hiện nay là Windows-1252 , một phần mở rộng của ISO 8859-1 .

Hiện nay chỉ có một mã hóa tương thích với ASCII có độ rộng thay đổi đáng được biết đến, nhưng nó rất quan trọng: UTF-8 , gói tất cả Unicode thành một bảng mã tương thích ASCII. Bạn thực sự muốn sử dụng nó nếu bạn có thể quản lý nó.

Lưu ý cuối cùng, "ASCII" ngày nay lấy định nghĩa thực tế của nó từ Unicode, không phải là tiêu chuẩn ban đầu của nó (ANSI X3.4-1968), bởi vì trong lịch sử đã có hàng chục biến thể trên bảng kê 127 ký tự ASCII - ví dụ, một số dấu câu có thể được thay thế bằng các chữ cái có dấu để tạo điều kiện cho việc truyền tải văn bản tiếng Pháp. Ngày nay, tất cả các biến thể đó đều lỗi thời và khi mọi người nói "ASCII" thì có nghĩa là các byte có giá trị 0x00 đến 0x7F mã hóa các điểm mã Unicode từ U + 0000 đến U + 007F. Điều này có lẽ sẽ chỉ quan trọng đối với bạn nếu bạn thấy mình đang viết một tiêu chuẩn kỹ thuật.

Nếu bạn quan tâm đến lịch sử của ASCII và các mã hóa trước nó, hãy bắt đầu với bài báo "Sự phát triển của mã ký tự, 1874-1968" (samizdat copy tại http://falsedoor.com/doc/ascii_evolution-of- character-Code.pdf ) và sau đó đuổi theo các tài liệu tham khảo của nó (nhiều trong số đó không có sẵn trên mạng và có thể khó tìm ngay cả khi truy cập vào thư viện đại học, tôi rất tiếc phải nói).


1
Vậy ASCII hiện nay là 7-bit hay 8-bit? Bạn nói rằng nó sử dụng 0x00-0x7F ngay bây giờ, rõ ràng. Nhưng chúng ta có đếm số 0 đứng đầu không?
Anurag Kalia

8
Điều đó phụ thuộc vào loại bàn đạp của bạn. Thông số kỹ thuật vẫn chính thức định nghĩa ASCII (ANSI X3.4-1968) mô tả nó là mã hóa 7 bit, nhưng không ai truyền byte 7 bit nữa và khả năng tương tác ngày nay quy định rằng bit thứ tám phải bằng 0 - bạn không thể sử dụng nó cho một bit chẵn lẻ hoặc tương tự. Vì vậy, IMNSHO có giá trị như nhau khi mô tả ASCII như một mã hóa tám bit mà tình cờ để lại nửa trên của không gian số là "dành riêng, không sử dụng". Dù bằng cách nào, nếu bạn truyền các byte tám bit bất kỳ trong số đó có đặt bit cao, bạn sẽ không truyền ASCII hợp lệ.
zwol

1
(... nhưng bạn có thể đang truyền thứ gì đó hợp lệ-khác, như UTF-8 hoặc ISO 8859-1 hoặc KOI8-R.)
zwol

1
Để thực sự phức tạp, tiêu chuẩn bây giờ là INCITS 4-1986 [R2012] vì ASC trước đây được gọi là X3 đột biến thành NCITS rồi INCITS. Nhưng các biến thể 7-bit với khoảng một chục chữ cái có dấu cho tiếng Pháp, tiếng Đức, tiếng Tây Ban Nha, v.v. không phải là ANSI / INCITS, thay vì ISO / IEC 646 và ECMA-6. Và nó là 8-bit (ISO / IEC) 8859-1 tạo thành khối 256 ký tự đầu tiên của Unicode.
dave_thompson_085 27/12/15

2
@ dave_thompson_085 Không phải ai cũng hiểu như bạn - có nghĩa là bạn có thể tìm thấy tài liệu kỹ thuật cũ hơn và thậm chí cả các tiêu chuẩn, tham chiếu "ASCII" hoặc thậm chí "X3.4-1968", có ý định bao gồm các biến thể quốc gia hoặc ít nhất không loại trừ rõ ràng dẫn đến tranh luận. Do đó, cá nhân tôi sẽ sử dụng Unicode làm tham chiếu chuẩn cho ASCII nếu tôi phải viết một thông số kỹ thuật mà nó quan trọng. Đó là tất cả những gì tôi muốn nói.
zwol

14

Trên Linux man asciinói:

ASCII là Mã tiêu chuẩn của Hoa Kỳ để trao đổi thông tin. Nó là một mã 7-bit.


9

Bảng ASCII ban đầu được mã hóa trên 7 bit do đó nó có 128 ký tự.

Ngày nay, hầu hết người đọc / người biên tập sử dụng bảng ASCII "mở rộng" (từ ISO 8859-1 ), được mã hóa trên 8 bit và có 256 ký tự (bao gồm Á , Ä , Œ , é , è và các ký tự khác hữu ích cho các ngôn ngữ châu Âu như glyphs toán học và các ký hiệu khác).

Mặc dù UTF-8 sử dụng mã hóa giống như bảng ASCII cơ bản (có nghĩa 0x41A trong cả hai mã), nhưng nó không chia sẻ cùng một mã hóa cho khối "Latinh Extended-A". Điều này đôi khi khiến các ký tự kỳ lạ xuất hiện trong các từ như gọi món hoặc piñata .


Có một số sai lầm ở trên. Œ không phải là một phần của ISO 8859-1 mặc dù nó nằm trong CP-1252 . Và khối Latinh Extended-A không phải là 128 hoặc 256 ký tự đầu tiên của Unicode: nó là khối tiếp theo sau các khối này chứa các chữ cái như ğ, ł và ſ.
Richard Smith,

Điểm tốt! Tôi nghĩ ý tôi là "Phần bổ sung Latin-1". Tiêu chuẩn tiêu chuẩn ...
Guillaume

1
Có nhiều bộ ký tự "ASCII mở rộng" và chỉ một trong số chúng là ISO 8859-1. Thuật ngữ này gần như vô nghĩa vì khi bạn mã hóa và giải mã văn bản, bạn phải biết mã hóa ký tự cụ thể nào đang được sử dụng (và nó thậm chí có thể không dành cho bộ ký tự ASCII Mở rộng).
Tom Blodget,

2

Mã hóa ASCII là 7 bit, nhưng trong thực tế, các ký tự mã hóa trong ASCII không được lưu trữ trong các nhóm 7 bit. Thay vào đó, một ASCII được lưu trữ trong một byte, với MSB thường được đặt thành 0 (vâng, nó bị lãng phí trong ASCII).

Bạn có thể xác minh điều này bằng cách nhập một chuỗi trong bộ ký tự ASCII trong trình soạn thảo văn bản, đặt mã hóa thành ASCII và xem nhị phân / hex:
nhập mô tả hình ảnh ở đây

Bên cạnh đó: việc sử dụng (nghiêm ngặt) mã hóa ASCII hiện nay không phổ biến, có lợi cho UTF-8 (điều này không lãng phí MSB đã đề cập ở trên - trên thực tế, MSB là 1 cho biết điểm mã được mã hóa với nhiều hơn 1 byte).


0

Mã ASCII ban đầu cung cấp 128 ký tự khác nhau được đánh số từ 0 đến 127. ASCII 7-bit là đồng nghĩa, vì byte 8-bit là phần tử lưu trữ chung, ASCII dành chỗ cho 128 ký tự bổ sung được sử dụng cho ngôn ngữ nước ngoài và các ký hiệu khác. Nhưng mã 7-bit ban đầu được tạo ra trước mã 8-bit. ASCII là viết tắt của American Standard Code for Information Interchange Trong các hệ thống thư internet ban đầu, nó chỉ hỗ trợ mã ASCII 7-bit, điều này là do sau đó nó có thể thực thi các chương trình và tệp đa phương tiện qua các hệ thống. Các hệ thống này sử dụng 8 bit của byte nhưng sau đó nó phải được chuyển thành định dạng 7 bit bằng các phương pháp mã hóa như MIME, UUcoding và BinHex. Điều này có nghĩa là 8-bit đã được chuyển đổi thành ký tự 7-bit, điều này sẽ bổ sung thêm các byte để mã hóa chúng.


-2

khi chúng ta gọi ASCII là mã 7 bit, bit ngoài cùng bên trái được sử dụng làm bit dấu nên với 7 bit chúng ta có thể viết lên đến 127. nghĩa là từ -126 đến 127 vì giá trị imam tối đa của ASCII là 0 đến 255. điều này có thể chỉ thỏa mãn với đối số là 7 bit nếu bit cuối cùng được coi là bit dấu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.